如何在SQL Server中使用GROUP BY的SUM函数?

3

我目前拥有:

SELECT Name, COUNT(*) as Total
FROM DataTable
WHERE Name IN ('A', 'B', 'C')
GROUP BY Name

最终输出结果:

Name    Total
--------------
 A        2
 B        5
 C        3

相反,我希望得到这个:

Name    Total
--------------
 A        10
 B        10
 C        10

这里的10是A/B/C名称匹配记录总数2 + 5 + 3之和。

我该如何实现这个功能?


1
abc分别显示这个图形的意义是什么?你能解释一下需求背后的逻辑吗? - Mureinik
实际上,在真正的查询中,我使用偏移量和限制来仅获取最初的10条记录,在下一次运行时,我将获取接下来的10条记录。我需要总计数以显示分页目的的记录总数。 - Quick-gun Morgan
3个回答

7
为了得到您想要的结果,您可以在分组的 COUNT(*) 上使用 SUM() OVER ()演示
SELECT Name, 
       SUM(COUNT(*)) OVER () as Total
FROM DataTable
WHERE Name IN ('A', 'B', 'C')
GROUP BY Name

1
有什么想法可以比较一下在更大的数据集上与 distinct .... count(*) over() 相比如何呢?计划看起来相似(移动了排序运算符位置)在非常简单的示例数据上。dbfiddle.uk - SqlZim
谢谢您的回答,我也在关注性能方面的问题。 - Quick-gun Morgan
@SqlZim 我用的是iPad,所以无法测试和查看计划。不过我想这可能更可取,因为它可以尽早减少行数。我猜你的计划可能会缓存整个表中的许多行。 - Martin Smith
@MartinSmith 您在 iPad 上无法在 dbfiddle.uk 中看到计划吗?- 不过您的想象是有道理的。 - SqlZim
1
@SqlZim 确实是这样。而且使用正确的索引可以完全避免排序。http://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=7066db5f0320b88c4e3f069d1c09c8fd 而那个方案中仍然包含了 distinct - Martin Smith

4
摆脱group by,使用distinct
select distinct Name, count(*) over() as Total
from t
where name in ('A', 'B', 'C')

rextester演示:http://rextester.com/WDMT68119

返回:

+------+-------+
| name | Total |
+------+-------+
| A    |    10 |
| B    |    10 |
| C    |    10 |
+------+-------+

1
如果您统计所有记录,然后在所有不同名称上执行交叉连接。
SELECT a.NAME
    ,x.Total
FROM DataTable a
CROSS JOIN (
    COUNT(*) AS Total FROM DataTable
    ) x
GROUP BY a.NAME
    ,x.Total

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接