SQL查询中分组COUNT的SUM

nam*_*tal 58 sql sum count

我有一个包含2个字段的表:

ID  Name
--  -------
1   Alpha
2   Beta
3   Beta
4   Beta
5   Charlie
6   Charlie

我想按名称对它们进行分组,使用'count'和一行'SUM'

Name     Count
-------  -----
Alpha     1
Beta      3
Charlie   2
SUM       6

如何编写查询以在表格下方添加SUM行?

Vis*_*har 64

SELECT name, COUNT(name) AS count
FROM table
GROUP BY name

UNION ALL

SELECT 'SUM' name, COUNT(name)
FROM table
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

name                                               count
-------------------------------------------------- -----------
alpha                                              1
beta                                               3
Charlie                                            2
SUM                                                6
Run Code Online (Sandbox Code Playgroud)


Yit*_*ncz 49

SELECT name, COUNT(name) AS count, SUM(COUNT(name)) OVER() AS total_count
FROM Table GROUP BY name
Run Code Online (Sandbox Code Playgroud)

  • 你能补充一些解释吗? (7认同)

Adr*_*der 10

没有指定您正在使用的rdbms

看看这个演示

SQL Fiddle DEMO

SELECT Name, COUNT(1) as Cnt
FROM Table1
GROUP BY Name
UNION ALL
SELECT 'SUM' Name, COUNT(1)
FROM Table1
Run Code Online (Sandbox Code Playgroud)

也就是说,我会建议您的表示层添加总数,而不是数据库.

这是使用ROLLUP汇总数据的SQL SERVER版本

SQL Fiddle DEMO

SELECT CASE WHEN (GROUPING(NAME) = 1) THEN 'SUM'
            ELSE ISNULL(NAME, 'UNKNOWN')
       END Name, 
      COUNT(1) as Cnt
FROM Table1
GROUP BY NAME
WITH ROLLUP
Run Code Online (Sandbox Code Playgroud)


Ita*_*ana 9

这里的所有解决方案都很棒,但不一定可以用于旧的 mysql 服务器(至少在我的情况下)。所以你可以使用子查询(我认为它不那么复杂)。

 select sum(t1.cnt) from 
        (SELECT column, COUNT(column) as cnt
            FROM
            table 
            GROUP BY 
            column
            HAVING 
            COUNT(column) > 1) as t1 ;
Run Code Online (Sandbox Code Playgroud)


小智 6

试试这个:

SELECT  ISNULL(Name,'SUM'), count(*) as Count
FROM table_name
Group By Name
WITH ROLLUP
Run Code Online (Sandbox Code Playgroud)


小智 5

请按如下方式运行:

Select sum(count) 
  from (select Name, 
               count(Name) as Count 
          from YourTable
      group by Name);  -- 6
Run Code Online (Sandbox Code Playgroud)


Jul*_*uls 5

我解释这个问题的方式是需要每组答案的小计值。小计结果非常简单,使用PARTITION

SUM(COUNT(0)) OVER (PARTITION BY [Grouping]) AS [MY_TOTAL]
Run Code Online (Sandbox Code Playgroud)

这是我的完整 SQL 调用的样子:

SELECT MAX(GroupName) [name], MAX(AUX2)[type],  
COUNT(0) [count], SUM(COUNT(0)) OVER(PARTITION BY GroupId) AS [total]
    FROM [MyView]
  WHERE Active=1 AND Type='APP' AND Completed=1
    AND [Date] BETWEEN '01/01/2014' AND GETDATE()
    AND Id = '5b9xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' AND GroupId IS NOT NULL
  GROUP BY AUX2, GroupId
Run Code Online (Sandbox Code Playgroud)

由此返回的数据如下所示:

name    type    count   total
Training Group 2    Cancelation 1   52
Training Group 2    Completed   41  52
Training Group 2    No Show 6   52
Training Group 2    Rescheduled 4   52
Training Group 3    NULL        4   10535
Training Group 3    Cancelation 857 10535
Training Group 3    Completed   7923    10535
Training Group 3    No Show 292 10535
Training Group 3    Rescheduled 1459    10535
Training Group 4    Cancelation 2   27
Training Group 4    Completed   24  27
Training Group 4    Rescheduled 1   27
Run Code Online (Sandbox Code Playgroud)