SQL - 如何汇总GROUP BY记录集?

时间:2015-04-15 04:20:47

标签: sql sql-server group-by aggregation

我对SQL并不是那么强大,需要一些帮助来弄清楚如何获得记录集中返回的数据。

到目前为止,这是我对查询的了解程度:

SELECT DATEDIFF(m, originalretaildate, getdate()) AS age_in_months, count(email) AS number_of_valid_emails
FROM #result2
WHERE originalretaildate BETWEEN '20140415' AND GETDATE()
GROUP BY DATEDIFF(m, originalretaildate, getdate())
ORDER BY 1

这给了我以下结果:

age_in_months       number_of_valid_emails
-----------------------------
0                   63
1                   2066
2                   1528
3                   2449
4                   1882
5                   1835
6                   1772
7                   2190
8                   2321
9                   2172
10                  2635
11                  1336
12                  601

我需要得到的是所有这些数字的总和(总计)。我很乐意把它放在底部,或者甚至只是回归一个人。

这样的事情:

age_in_months       number_of_valid_emails
-----------------------------
0                   63
1                   2066
...                 ...
SUM                 2129

非常感谢任何帮助。


它到了那里,我的SQL查询现在看起来像这样:

SELECT DATEDIFF(m, originalretaildate, getdate()) AS age_in_months,
count(email) AS number_of_valid_emails
FROM #result2
WHERE originalretaildate BETWEEN '20140415' AND GETDATE()
GROUP BY DATEDIFF(m, originalretaildate, getdate()) WITH ROLLUP
ORDER BY 2 ASC

这给了我这个:

0   65
--------
12  598
11  1329
2   1530
6   1777
5   1830
4   1875
1   2049
9   2176
7   2200
8   2319
3   2442
10  2631
NULL    22821

我现在的问题是它在最后一行显示'NULL'。任何想法如何解决这个问题,所以它说'总计'或'总和'?

1 个答案:

答案 0 :(得分:3)

根据我的理解,你想在底部总结价值观。您可以使用汇总来获取底部的值总和。

SELECT DATEDIFF(m, originalretaildate, getdate()) AS age_in_months,
count(email) AS number_of_valid_emails
FROM #result2
WHERE originalretaildate BETWEEN '20140415' AND GETDATE()
GROUP BY DATEDIFF(m, originalretaildate, getdate()) with rollup
ORDER BY 1

它将产生类似波纹管的输出。在底部,所有值的总和

age_in_months       number_of_valid_emails
-----------------------------
0                   63
1                   2066
2                   1528
3                   2449
4                   1882
5                   1835
6                   1772
7                   2190
8                   2321
9                   2172
10                  2635
11                  1336
12                  601

null                22850

编辑1

根据您的修改,您可以使用COALESCE这样的

来完成
SELECT COALESCE(DATEDIFF(m, originalretaildate, getdate()),'Total') AS age_in_months,
count(email) AS number_of_valid_emails
FROM #result2
WHERE originalretaildate BETWEEN '20140415' AND GETDATE()
GROUP BY DATEDIFF(m, originalretaildate, getdate()) with rollup
ORDER BY 1

编辑2

使用强制转换为您的月份数,然后使用coalesce()函数,以便能够以正确的方式投射它

 cast(DATEDIFF(m, originalretaildate, getdate()) as nvarchar(10))

整个查询将如下所示

SELECT COALESCE(cast(DATEDIFF(m, originalretaildate, getdate()) as nvarchar(10)),'Total') AS age_in_months,
count(email) AS number_of_valid_emails
FROM #result2
WHERE originalretaildate BETWEEN '20140415' AND GETDATE()
GROUP BY DATEDIFF(m, originalretaildate, getdate()) with rollup
ORDER BY 1