我正在计算在两个日期之间收到的实体数量,或者在这两个日期之间已经解决的实体数量,然后按来源对它们进行分组。
目前我的代码是
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
答案 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)