SUM of grouped COUNT in SQL Query

前端 未结 17 1719
夕颜
夕颜 2020-12-04 08:19

I have a table with 2 fields:

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

I want to group them by name, with \'co

相关标签:
17条回答
  • 2020-12-04 08:48

    You can use ROLLUP

    select nvl(name, 'SUM'), count(*)
    from table
    group by rollup(name)
    
    0 讨论(0)
  • 2020-12-04 08:50

    The way I interpreted this question is needing the subtotal value of each group of answers. Subtotaling turns out to be very easy, using PARTITION:

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

    This is what my full SQL call looks like:

    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
    

    The data returned from this looks like:

    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
    
    0 讨论(0)
  • 2020-12-04 08:51

    I am using SQL server and the following should work for you:

    select cast(name as varchar(16)) as 'Name', count(name) as 'Count' from Table1 group by Name union all select 'Sum:', count(name) from Table1

    0 讨论(0)
  • 2020-12-04 08:55

    Without specifying which rdbms you are using

    Have a look at this demo

    SQL Fiddle DEMO

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

    That said, I would recomend that the total be added by your presentation layer, and not by the database.

    This is a bit more of a SQL SERVER Version using Summarizing Data Using ROLLUP

    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
    
    0 讨论(0)
  • 2020-12-04 08:57

    all of the solution here are great but not necessarily can be implemented for old mysql servers (at least at my case). so you can use sub-queries (i think it is less complicated).

     select sum(t1.cnt) from 
            (SELECT column, COUNT(column) as cnt
                FROM
                table 
                GROUP BY 
                column
                HAVING 
                COUNT(column) > 1) as t1 ;
    
    0 讨论(0)
  • 2020-12-04 08:57
      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
    
    0 讨论(0)
提交回复
热议问题