多列上的 ROLLUP

ROLLUP on multiple columns

我正在计算在 2 个日期之间收到或在这两个相同日期之间解决的实体的数量,然后按其来源对它们进行分组。

目前我的密码是

SELECT 
    CASE WHEN GROUPING(EntitySource) = 1 THEN 'Total' ELSE EntitySource END EntitySource, 
    (
        SELECT COUNT(PostmarkDate) 
        FROM tblEntity t1
        Where ((PostmarkDate BETWEEN @StartDate AND @EndDate)) AND t1.EntitySource = t.EntitySource
    ) AS Recieved, 
    COUNT(ResolDate) AS Completed
FROM tblEntity t
WHERE 
    (IsCompleted = '1' AND (ResolDate BETWEEN @StartDate AND @EndDate)) OR ( (PostmarkDate BETWEEN @StartDate AND @EndDate))
GROUP BY EntitySource WITH ROLLUP
ORDER BY 
CASE WHEN EntitySource = 'D' THEN 1 ELSE 2 END,
CASE WHEN EntitySource = 'B' THEN 1 ELSE 2 END,
CASE WHEN EntitySource = 'C' THEN 1 ELSE 2 END,
CASE WHEN EntitySource = 'E' THEN 1 ELSE 2 END,
CASE WHEN EntitySource = 'A' THEN 1 ELSE 2 END,
CASE WHEN EntitySource = 'F' THEN 1 ELSE 2 END

使用此查询会得到 table 个

EntitySource    Recieved    Completed
D               79          175
B               272         614
C               19          13
E               1           6
A               1           0
F               3           12
Total           0           820

如您所见,ROLLUP 正确地汇总了已完成的实体列,但它根本没有汇总接收到的列。该列的总数应显示 375,总行数

Total           375         820

汇总适用于聚合函数。
因此,对 CASE 进行计数或求和也可以解决问题。

SELECT
   COALESCE(EntitySource,'Total') AS EntitySource,
   COUNT(CASE WHEN PostmarkDate BETWEEN @StartDate AND @EndDate THEN 1 END) AS Received, 
   COUNT(ResolDate) AS Completed
 FROM tblEntity t
 WHERE 
 (
      (IsCompleted = '1' AND ResolDate BETWEEN @StartDate AND @EndDate)     
   OR (PostmarkDate BETWEEN @StartDate AND @EndDate)
 )
 GROUP BY EntitySource WITH ROLLUP
 ORDER BY
 GROUPING(EntitySource),
 (CASE EntitySource
  WHEN 'D' THEN 1
  WHEN 'B' THEN 2
  WHEN 'C' THEN 3
  WHEN 'E' THEN 4
  WHEN 'A' THEN 5
  WHEN 'F' THEN 6
  ELSE 9
  END)