SQL查询在结果为零时显示聚合数据

时间:2012-10-31 11:41:52

标签: sql sql-server join aggregate coalesce

我有一个包含这样字段的表格:

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,这应该没有什么区别。但我仍然没有快乐。

3 个答案:

答案 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