汇总和总计

Aggregation and Total

SELECT  Region ,
        flag ,
        Name,
        COUNT(ID) AS 'CountWithFlag'
FROM    Table
GROUP BY flag

此查询为我提供了以下结果。我按标志分组,我能够根据标志获得 English/non-English 的计数。我还想在 counts

旁边显示英语和非英语的总计数

输出:

Region Flag  Name     CountWithFlag
a      0     English        100
b      1     Non-English    200 
c      0     English        100
d      1     Non-English    200

期望的输出:

Region Flag  Name     CountWithFlag  Total
a      0     English        100       200
b      1     Non-English    200       400
c      0     English        100       200
d      1     Non-English    200       400

我该怎么做?我想对带有标志的特定计数应用分组依据。但我也想在同一个查询中获得总计数!

关于我如何做到这一点的任何意见?

另一种方式是这样的:

;
WITH    agg1
            AS (
                SELECT  region,
                        flag,
                        name,
                        COUNT(id) AS 'CountWithFlag'
                FROM    [dbo].[t2]
                GROUP BY region,
                        flag,
                        name
                ),
        agg2
            AS (
                SELECT  [name],
                        COUNT(id) AS CountByName
                FROM    [dbo].[t2]
                GROUP BY [name]
                )
    SELECT  [agg1].[region],
            [agg1].[flag],
            [agg1].[name],
            [agg1].[CountWithFlag],
            [agg2].[CountByName]
    FROM    [agg1]
            INNER JOIN [agg2]
                ON [agg2].[name] = [agg1].[name]

试试这个

  ;
    WITH    cte
              AS ( SELECT DISTINCT
                            Region ,
                            flag ,
                            Name ,
                            COUNT(ID) OVER ( PARTITION BY flag, Region, Name ) AS [CountWithFlag]
                   FROM     [Table]
                 )
        SELECT  Region ,
                flag ,
                Name ,
                SUM([CountWithFlag]) OVER ( PARTITION BY Name ) AS Total
        FROM    cte

如果您想避免使用 window 函数,您可以这样做:

SELECT 
  Region,
  flag,
  Name,
  COUNT(ID) AS CountWithFlag,
  (select count(ID) from Table as tbl1 where tbl1.Name=tbl.Name) AS Total
from Table as tbl
group by Region, flag, Name

但我的意见是 window 聚合应该工作得更快。

如果您想使用 window 聚合,请执行以下操作:

select 
  Region,
  flag,
  Name,
  CountWithFlag,
  sum(CountWithFlag) over(partition by Name) as Total
from (
  SELECT 
    Region,
    flag,
    Name,
    COUNT(ID) AS CountWithFlag
  from Table as tbl
  group by Region, flag, Name
) as tbl