我有一个包含这样字段的表格:
Item
Category
Year
Month
Value
我想汇总此表中的结果,以显示每个类别,年份和月份的总和(值)。所以我有这个问题:
SELECT Category, Year, Month, SUM(Value)
FROM Table
GROUP BY Category, Year, Month;
这样可以正常工作,但是在总和为零的月份中,不会显示月份。我希望所有月份在适用的总价值中显示为零。
我尝试过COALESCE(SUM(Value),0)
,但这不起作用。
我尝试使用年份和月份值创建一个单独的表(Table2),然后将其与第一个表连接:
SELECT Category, Year, Month, SUM(Value)
FROM Table
RIGHT JOIN Table2
ON Table2.Year + Table2.Month = Table.Year + Table.Month
GROUP BY Category, Year, Month;
这也不起作用。我做错了什么?
编辑:
我使用以下查询尝试了Dems的解决方案:
SELECT
Category.name,
Dates.Year,
Dates.Month,
SUM(Data.Value) AS Value
FROM
Category
CROSS JOIN
Dates
LEFT JOIN
Data
ON data.CategoryID = Category.ID
AND data.Year = Dates.Year
AND data.Month = Dates.Month
WHERE data.Year BETWEEN #### and ####
AND data.Month BETWEEN # AND #
AND data.Property IN (‘A1’,’B1’)
AND data.Property2 IN (‘C1’,’D1’)
GROUP BY
Category.name,
Dates.Year,
Dates.Month
唯一可以看出的差异是我在数据上使用了where子句,并且错过了ORDER BY,这应该没有什么区别。但我仍然没有快乐。
答案 0 :(得分:2)
您需要向Table2
添加类别,或者(甚至更好)有一个Category
表。
然后,您需要按这些查找表进行分组,而不是数据表。
SELECT
Category.name,
Dates.Year,
Dates.Month,
SUM(Data.Value) AS Value
FROM
Category
CROSS JOIN
Dates
LEFT JOIN
Data
ON data.CategoryID = Category.ID
AND data.Year = Dates.Year
AND data.Month = Dates.Month
AND data.Property IN ('A1','B1')
AND data.Property2 IN ('C1','D1')
WHERE Dates.Year BETWEEN #### AND ####
AND Dates.Month BETWEEN #### AND ####
GROUP BY
Category.name,
Dates.Year,
Dates.Month
ORDER BY
Category.name,
Dates.Year,
Dates.Month
答案 1 :(得分:0)
SELECT Table.Category, Table.Year, Table.Month, SUM(Table.Value)
FROM Table
right outer JOIN Table2
ON Table2.Year= Table.Year and Table2.Month =Table.Month
GROUP BY Table.Category,Table2.Year, Table2.Month;
答案 2 :(得分:0)
不是在on语句中添加年份和月份,而是分别检查月份和年份的条件。 像这样 在Table2.Year = Table.Year和Table2.Month = Table.Month