Maison > Questions et réponses > le corps du texte
Il y a un problème avec ma requête. J'ai deux tables et je souhaite les rejoindre pour obtenir des résultats basés sur la clé primaire de la première table, mais il me manque 1 donnée de la première table.
C'est mon violon
Comme vous pouvez le voir, il me manque "xx3" pour le mois 1
J'ai essayé de changer les connexions gauche et droite mais toujours le même résultat.
Comme vous pouvez le voir, je dois définir coalesce(sum(b.sd_qty),0) 设置为总计,
如果没有 qty
,则将 0
sur la valeur par défaut.
P粉2877263082024-02-26 09:49:06
Vous devez également rejoindre la table à différentes dates :
SELECT a.item_code, COALESCE(SUM(b.sd_qty), 0) total, DATE_FORMAT(d.sd_date, '%m-%Y') month_year FROM item a CROSS JOIN ( SELECT DISTINCT sd_date FROM sales_details WHERE sd_date >= '2020-04-01' - INTERVAL 3 MONTH AND sd_date < '2020-05-01' ) d LEFT JOIN sales_details b ON a.item_code = b.item_code AND b.sd_date = d.sd_date GROUP BY month_year, a.item_code ORDER BY month_year, a.item_code;
Alternativement, pour MySql 8.0+, utilisez un CTE récursif pour renvoyer les dates de début de tous les mois pour lesquels vous souhaitez le résultat, qui peuvent être joints au tableau :
WITH RECURSIVE dates AS ( SELECT '2020-04-01' - INTERVAL 3 MONTH AS sd_date UNION ALL SELECT sd_date + INTERVAL 1 MONTH FROM dates WHERE sd_date + INTERVAL 1 MONTH < '2020-05-01' ) SELECT a.item_code, COALESCE(SUM(b.sd_qty), 0) total, DATE_FORMAT(d.sd_date, '%m-%Y') month_year FROM item a CROSS JOIN dates d LEFT JOIN sales_details b ON a.item_code = b.item_code AND DATE_FORMAT(b.sd_date, '%m-%Y') = DATE_FORMAT(d.sd_date, '%m-%Y') GROUP BY month_year, a.item_code ORDER BY month_year, a.item_code;
Voir la Démo.