ROLLUP на нескольких столбцах - PullRequest
0 голосов
/ 18 мая 2018

Я считаю количество сущностей, которые были получены между двумя датами или были разрешены между этими теми же двумя датами, и затем группирую их по их источнику.

В настоящее время мой код

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 голосов
/ 18 мая 2018

Сведение работает с агрегатными функциями.
Таким образом, подсчет или суммирование 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)
...