私のクエリには問題があります。 2 つのテーブルがあり、それらを結合して最初のテーブルの主キーに基づいた結果を取得したいのですが、最初のテーブルのデータが 1 つ欠落しています。
これは私のヴァイオリンです
ご覧のとおり、月 1 の「xx3」が欠落しています
左右の接続を変えてみましたが結果は同じでした。
ご覧のとおり、coalesce(sum(b.sd_qty),0) を合計に設定する必要があります。
qty がない場合は、
0 はデフォルト値です。
P粉2877263082024-02-26 09:49:06
テーブルを異なる日付に相互結合する必要もあります:
SELECT a.item_code, COALESCE(SUM(b.sd_qty), 0) 合計, DATE_FORMAT(d.sd_date, '%m-%Y') month_year 項目aから クロス結合 ( SELECT DISTINCT sd_date 販売詳細から WHERE sd_date >= '2020-04-01' - 間隔 3 か月および 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;
あるいは、MySql 8.0 の場合は、再帰的 CTE を使用して、結果が必要なすべての月の開始日を返します。これをテーブルに相互結合できます。
WITH RECURSIVE 日付 AS ( '2020-04-01' を選択 - sd_date として 3 か月間隔 すべてを結合する sd_date 間隔 1 か月を選択 FROMの日付 WHERE sd_date 間隔 1 か月 < '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;
表示デモ。