多栏上的ROLLUP

时间:2018-05-18 18:42:17

标签: sql sql-server sql-server-2017

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

目前我的代码是

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

使用此查询会产生

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

1 个答案:

答案 0 :(得分:0)

汇总适用于聚合函数 因此计算或总结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)