この質問には多くのバリエーションがあると思いますが、これにはひねりがあります。
私のプライマリ テーブルには、特定のユーザーの特定の日付の記録されたキロメートルが含まれています。
表km_run
:
|entry|mnumber|dato |km |
ここで、「dato」は特定の日付です。フォーマットは次のようなものです:
|1 |3 |2013-01-01|5.7
| |
特定のユーザー ('mnumber') について、1 年の各週の合計を計算したいと考えています。この目的のために、1 から 53 までの週番号だけを含む「ダミー テーブル」を作成しました。
Table `week_list`:
|week|
|1 |
|2 |
等..
このクエリは合計を返しますが、特定の週の「km_run」にエントリがない場合、ゼロを返す方法が見つかりません。
SELECT `week_list`.`week`, WEEKOFYEAR(`km_run`.`dato`), SUM(`km_run`.`km`)
FROM `week_list` LEFT JOIN `km_run` ON WEEKOFYEAR(`dato`) = `week_list`.`week`
WHERE `km_run`.`mnumber` = 3 AND `km_run`.`dato` >= '2013-01-01'
AND `km_run`.`dato` < '2014-01-01'
GROUP BY WEEKOFYEAR(`dato`)
COALESCE( SUM( km
),0) を実行しようとしましたが、合計の周りに IFNULL 関数を使用しようとしました。左結合にもかかわらず、week_list のすべてのレコードが sql ステートメントで返されるわけではありません。
結果は次のとおりです。
week | WEEKOFYEAR(`km_run`.`dato`) | SUM(`km_run`.`km`)
1 | 1 | 58.4
3 | 3 | 50.7
4 | 4 | 39.2
ご覧のとおり、0 を返す代わりに 2 週目がスキップされます。