ミスターヴァンダービルト:
私は、SQLクエリに基づいて図を作成します。図は、そのうちのいくつかは、将来的に残っている場合でも、現在の年の12ヶ月ごとに表示されるはずです。
私のSQLクエリは、このようなものです:
SELECT
MONTH (created) as m,
sum (price) as s
FROM
product
WHERE
YEAR (created) = 2020
GROUP BY
m
また、すべてのエントリを持っている現在または過去数ヶ月のために当然のことながら、これだけ結果を示します。
出来ますか
- 12グループがどのような場合に表示されるようにクエリを策定し、
- グループがない場合には、デフォルト値の0を取得しますか?
キーズJard:
確かに、左のすべての12ヶ月のコレクションに参加。これは、MySQL(私は多分Postgresのあまりに、MySQLだけだと思うGROUP BYの別名を、使用しているため)です。
WITH months as (
SELECT 1 as m
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
UNION ALL SELECT 9
UNION ALL SELECT 10
UNION ALL SELECT 11
UNION ALL SELECT 12
)
SELECT
m.m,
sum (p.price) as s
FROM
months m
LEFT JOIN product p
ON
m.m = MONTH(p.created) AND
p.created > '2020-01-01' and p.Created < '2021-01-01'
GROUP BY
m.m
一致していないか月間は0として合計するNULLを、持っています
彼らはインデックスが使用できないことを意味するので、あなたは、WHERE句で)(試してみて、YEARのような機能を使用しないことを好むべきです。代わりに、単独のテーブルデータを残し、代わりに及んだ検索をかけます
あなたのMySQLが古く、CTEをサポートしていない場合は、代わりにサブクエリことを確認してください。データベースは、MySQL / Pgのではないか、それが何かを選択する必要がある場合、あなたはそれが唯一の1行を持つ表から選択することができます
参加採用していない代替トリックは、労働組合にゼロヶ月の負担になります。彼らは合計に貢献する文句を言わないが、0で月を提供します:
SELECT
m,
sum (price) as s
FROM
(
SELECT MONTH(created) as m, price FROM product WHERE created >= '2020-01-01' and created < '2021-01-01'
UNION ALL SELECT 1, 0 UNION ALL SELECT 2, 0 UNION ALL SELECT 3, 0
UNION ALL SELECT 4, 0 UNION ALL SELECT 5, 0 UNION ALL SELECT 6, 0
UNION ALL SELECT 7, 0 UNION ALL SELECT 8, 0 UNION ALL SELECT 9, 0
UNION ALL SELECT 10, 0 UNION ALL SELECT 11, 0 UNION ALL SELECT 12, 0
) x
GROUP BY
m
あなたは数字や日付専用のテーブルを持っている場合は、労働組合のすべてのブロックは、それへの呼び出しに置き換えることができます。あなたはPostgresのであれば、それはでき系列発生器持っているクールなことを行うと