#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];