Свод в SQL Server с промежуточным итогом и общим итогом

#sql-server

#sql-server

Вопрос:

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

 SELECT *
FROM 
( SELECT DESC,STATUS
 FROM MASTER 
 ) rc
PIVOT
( COUNT(DESC)
 FOR STATUS IN ( [ACTIVE], [INACTIVE])
 ) AS pvt
  

Записи:

 AAA    ACTIVE
AAA    ACTIVE
AAA    INACTIVE
BBB    ACTIVE
BBB    INACTIVE
CCC    ACTIVE
DDD    INACTIVE
  

Желаемый результат:

 DESC   ACTIVE  INACTIVE TOTAL
------------------------------
AAA    2       1        3
BBB    1       1        2
CCC    1       0        1
DDD    0       1        1
TOTAL  4       3        7
  

Ответ №1:

Встроенный синтаксис PIVOT является проприетарным и довольно ограниченным. Во многих случаях проще использовать условную агрегацию. Общее количество для каждой группы строк по разделам может быть выполнено с помощью COUNT(*) . Итог по столбцу может быть добавлен отдельным запросом, который добавляется с помощью UNION ALL .

Что-то вроде этого

 with union_cte as (
    select [DESC], 1 sort_order,
           SUM(case when [status]='ACTIVE' THEN 1 ELSE 0 END) [Active],
           SUM(case when [status]='INACTIVE ' THEN 1 ELSE 0 END) [INACTIVE],
           count(*) [TOTAL]
    from [master] 
    group by [DESC]
    union all 
    select 'TOTAL', 2 sort_order,
           SUM(case when [status]='ACTIVE' THEN 1 ELSE 0 END) [Active],
           SUM(case when [status]='INACTIVE ' THEN 1 ELSE 0 END) [INACTIVE],
           count(*) [TOTAL]
    from [master])
select *
from union_cte
order by sort_order, [DESC];