【问题标题】:SUM of grouped COUNT in SQL QuerySQL 查询中分组 COUNT 的总和
【发布时间】:2012-10-07 07:04:35
【问题描述】:

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

身份证名称 -- ------ 1 阿尔法 2 测试版 3 测试版 4 测试版 5 查理 6查理

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

名称计数 -------- ----- 阿尔法 1 测试版 3 查理 2 总和 6

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

【问题讨论】:

  • 如果您需要选择本身的总和来计算,请使用子选择:SELECT Name, COUNT(*) AS amount, COUNT(*)/total.total * 100 AS percentage, total.total FROM temp, ( SELECT COUNT(*) AS total FROM temp ) AS total GROUP BY NameSee SQLfiddle
  • 注意下面的答案——没有 ORDER BY 的查询结果中没有保证顺序。

标签: sql count sum


【解决方案1】:

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

SUM(COUNT(0)) OVER (PARTITION BY [Grouping]) AS [MY_TOTAL]

这是我完整的 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

由此返回的数据如下:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这对我来说很有意义
    【解决方案3】:

    我还需要having count(*) > 1。因此,在参考了上述一些查询后,我编写了自己的查询

    语法:

    select sum(count) from (select count(`table_name`.`id`) as `count` from `table_name` where {some condition} group by {some_column} having count(`table_name`.`id`) > 1) as `tmp`;
    

    例子:

    select sum(count) from (select count(`table_name`.`id`) as `count` from `table_name` where `table_name`.`name` IS NOT NULL and `table_name`.`name` != '' group by `table_name`.`name` having count(`table_name`.`id`) > 1) as `tmp`;
    

    【讨论】:

      【解决方案4】:

      我正在使用 SQL 服务器,以下内容应该适合您:

      select cast(name as varchar(16)) as 'Name', count(name) as 'Count' 从表 1 按名称分组 联合所有 选择“总和:”,计数(名称) 来自表1

      【讨论】:

        【解决方案5】:
        SELECT name, COUNT(name) AS count
        FROM table
        GROUP BY name
        
        UNION ALL
        
        SELECT 'SUM' name, COUNT(name)
        FROM table
        

        输出:

        name                                               count
        -------------------------------------------------- -----------
        alpha                                              1
        beta                                               3
        Charlie                                            2
        SUM                                                6
        

        【讨论】:

        • 有效答案。请使用汇总查看@Adrinn 的答案。 stackoverflow.com/a/12927333/2012977
        • 什么是Union all?编辑:好的,我因为它的缩进而感到困惑。这只是联合 2 个选择器 :)
        【解决方案6】:

        试试这个:

        SELECT  ISNULL(Name,'SUM'), count(*) as Count
        FROM table_name
        Group By Name
        WITH ROLLUP
        

        【讨论】:

          【解决方案7】:

          你可以使用 ROLLUP

          select nvl(name, 'SUM'), count(*)
          from table
          group by rollup(name)
          

          【讨论】:

            【解决方案8】:

            从中选择总和 (select count(Col_name) as s from Tab_name group by Col_name with count(*)>1)c

            【讨论】:

              【解决方案9】:
                with cttmp
                as
                (
                select Col_Name, count(*) as ctn from tab_name group by Col_Name having count(Col_Name)>1
                )
                select sum(ctn) from c
              

              【讨论】:

                【解决方案10】:

                请如下运行:

                Select sum(count) 
                  from (select Name, 
                               count(Name) as Count 
                          from YourTable
                      group by Name);  -- 6
                

                【讨论】:

                  【解决方案11】:

                  查询后,在下面运行以获取总行数

                  select @@ROWCOUNT
                  

                  【讨论】:

                  • 他想知道例如 CHARLIE 的计数,而不是 NAMES 的计数。
                  【解决方案12】:
                  SELECT name, COUNT(name) AS count, SUM(COUNT(name)) OVER() AS total_count
                  FROM Table GROUP BY name
                  

                  【讨论】:

                  • 你能补充一些解释吗?
                  • 我添加了缺失的部分
                  • 这行得通,但解释会很有用。
                  【解决方案13】:

                  Sql server 你可以试试这个。

                  SELECT ISNULL([NAME],'SUM'),Count([NAME]) AS COUNT
                  FROM TABLENAME
                  GROUP BY [NAME] WITH CUBE
                  

                  【讨论】:

                    【解决方案14】:

                    把它当作

                    select Name, count(Name) as Count from YourTable
                    group by Name
                    union 
                    Select 'SUM' , COUNT(Name) from YourTable
                    

                    【讨论】:

                    • 我选择 UNION ALL 而不是 UNION 将“SUM”行放在底部(根据上面@VishalSuthar 的回答)
                    • 我认为你误解了 UNION 和 UNION ALL UNION removes duplicate records (where all columns in the results are the same), UNION ALL does not. 那是我使用的 UNION
                    • 感谢您的更正,但在这种情况下,我必须将“SUM”放在底线,这可以通过使用 UNION ALL 来完成
                    • 您是否尝试使用 UNION?正如我所尝试的,它必须将“SUM”放在底部,但就性能而言,UNION ALL 在您的场景中是好的,因为 UNION 很多性能较差,因为它必须扫描结果以查找重复项..
                    • 我已经在更大的数据库中尝试过它,它将“SUM”放在表格的中间(并不总是在底部)。无论如何,我明白了 UNION ALL 和 UNION 之间的区别,谢谢
                    【解决方案15】:

                    不指定你使用的是哪个 rdbms

                    看看这个演示

                    SQL Fiddle DEMO

                    SELECT Name, COUNT(1) as Cnt
                    FROM Table1
                    GROUP BY Name
                    UNION ALL
                    SELECT 'SUM' Name, COUNT(1)
                    FROM Table1
                    

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

                    这更像是一个使用 Summarizing Data Using 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
                    

                    【讨论】:

                    • 第二次选择不应该是总和,而不是计数吗?
                    • @Greg,如果您重新引用顶部的语句,它应该是 sum,可能使用 WITH CTE 语句(Sql Server)。
                    • 感谢您指出汇总。您的答案应该是公认的答案。我们有很大的桌子,讨厌两次敲桌子。
                    【解决方案16】:

                    您可以使用联合来连接行。

                    select Name, count(*) as Count from yourTable group by Name
                    union all
                    select "SUM" as Name, count(*) as Count from yourTable
                    

                    【讨论】:

                      【解决方案17】:

                      您可以尝试按名称分组并计算该组中的 ID。

                      SELECT name, count(id) as COUNT FROM table group by name
                      

                      【讨论】:

                      • 我认为您错过了“SUM”行
                      猜你喜欢
                      • 1970-01-01
                      • 2020-02-12
                      • 2013-12-15
                      • 2020-04-06
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多