SQL 数据透视表中的总计
Totals in SQL Pivot
我想获取电子表格之类的总计到我拥有的这个 SQL 数据透视表。下面可以很好地以没有小计的数据透视格式显示值。如果有一种方法可以同时获得行和列的总计,那就太好了。如果没有,至少total在底部就好了。
SELECT *
FROM (SELECT period, status
FROM tasks )
PIVOT
(
COUNT(status)
FOR status IN ('Completed' AS "Completed",
'WIP' AS "WIP",
'Not Started' AS "Not Started")
)
ORDER BY period
除了使用 PIVOT
,您还可以使用 ROLLUP
和条件聚合:
SELECT CASE GROUPING_ID(period) WHEN 1 THEN 'TOTAL' ELSE TO_CHAR(period) END AS period,
COUNT(CASE status WHEN 'Completed' THEN 1 END) AS completed,
COUNT(CASE status WHEN 'WIP' THEN 1 END) AS wip,
COUNT(CASE status WHEN 'Not Started' THEN 1 END) AS not_started,
COUNT(*) AS total
FROM tasks
GROUP BY ROLLUP(period)
ORDER BY period;
其中,对于示例数据:
CREATE TABLE tasks (period, status) AS
SELECT 1, 'Completed' FROM DUAL CONNECT BY LEVEL <= 3 UNION ALL
SELECT 1, 'WIP' FROM DUAL CONNECT BY LEVEL <= 2 UNION ALL
SELECT 1, 'Not Started' FROM DUAL CONNECT BY LEVEL <= 1 UNION ALL
SELECT 2, 'Completed' FROM DUAL CONNECT BY LEVEL <= 2 UNION ALL
SELECT 2, 'WIP' FROM DUAL CONNECT BY LEVEL <= 1 UNION ALL
SELECT 3, 'Completed' FROM DUAL CONNECT BY LEVEL <= 4 UNION ALL
SELECT 3, 'Not Started' FROM DUAL CONNECT BY LEVEL <= 2;
输出:
PERIOD
COMPLETED
WIP
NOT_STARTED
TOTAL
1
3
2
1
6
2
2
1
0
3
3
4
0
2
6
TOTAL
9
3
3
15
db<>fiddle here
我想获取电子表格之类的总计到我拥有的这个 SQL 数据透视表。下面可以很好地以没有小计的数据透视格式显示值。如果有一种方法可以同时获得行和列的总计,那就太好了。如果没有,至少total在底部就好了。
SELECT *
FROM (SELECT period, status
FROM tasks )
PIVOT
(
COUNT(status)
FOR status IN ('Completed' AS "Completed",
'WIP' AS "WIP",
'Not Started' AS "Not Started")
)
ORDER BY period
除了使用 PIVOT
,您还可以使用 ROLLUP
和条件聚合:
SELECT CASE GROUPING_ID(period) WHEN 1 THEN 'TOTAL' ELSE TO_CHAR(period) END AS period,
COUNT(CASE status WHEN 'Completed' THEN 1 END) AS completed,
COUNT(CASE status WHEN 'WIP' THEN 1 END) AS wip,
COUNT(CASE status WHEN 'Not Started' THEN 1 END) AS not_started,
COUNT(*) AS total
FROM tasks
GROUP BY ROLLUP(period)
ORDER BY period;
其中,对于示例数据:
CREATE TABLE tasks (period, status) AS
SELECT 1, 'Completed' FROM DUAL CONNECT BY LEVEL <= 3 UNION ALL
SELECT 1, 'WIP' FROM DUAL CONNECT BY LEVEL <= 2 UNION ALL
SELECT 1, 'Not Started' FROM DUAL CONNECT BY LEVEL <= 1 UNION ALL
SELECT 2, 'Completed' FROM DUAL CONNECT BY LEVEL <= 2 UNION ALL
SELECT 2, 'WIP' FROM DUAL CONNECT BY LEVEL <= 1 UNION ALL
SELECT 3, 'Completed' FROM DUAL CONNECT BY LEVEL <= 4 UNION ALL
SELECT 3, 'Not Started' FROM DUAL CONNECT BY LEVEL <= 2;
输出:
PERIOD COMPLETED WIP NOT_STARTED TOTAL 1 3 2 1 6 2 2 1 0 3 3 4 0 2 6 TOTAL 9 3 3 15
db<>fiddle here