总计 SQL Table
%Total from SQL Table
使用下面的代码;
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 transition_tasks_new
GROUP BY ROLLUP(period)
ORDER BY period;
我正在获取附件格式的数据:
很好。但是,我需要为他们每个人获得 %complete 。
例如 - 更新前“完成”百分比将是 2/28,即 7%;
我写了这个查询;
SELECT SUM(CASE WHEN period = '1-Pre Update' THEN 1 ELSE 0 END) AS value,
COUNT(taskid) AS max_value
FROM transition_tasks_new
WHERE status='Completed'
但它没有按预期工作。
SELECT X.*,
ROUND(X.COMPLETED / X.TOTAL * 100,
2) AS PERCENT_COMPLETE
FROM
(WITH SAMPLE_DATA AS
(SELECT '1-Pre-Update' AS PERIOD,
3 AS WIP,
2 AS COMPLETED,
23 AS NOT_STARTED) SELECT PERIOD,
SUM(WIP) AS WIP,
SUM(COMPLETED) AS COMPLETED,
SUM(NOT_STARTED) AS NOT_STARTED,
SUM(WIP + COMPLETED + NOT_STARTED) AS TOTAL
FROM SAMPLE_DATA
GROUP BY PERIOD) X
将数值除以总数再乘以100计算百分比:
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,
ROUND(COUNT(CASE status WHEN 'Completed' THEN 1 END)/COUNT(*) * 100, 3)
AS percent_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 1, 'Other' 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
PERCENT_COMPLETED
WIP
NOT_STARTED
TOTAL
1
3
42.857
2
1
7
2
2
66.667
1
0
3
3
4
66.667
0
2
6
TOTAL
9
56.25
3
3
16
db<>fiddle here
使用下面的代码;
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 transition_tasks_new
GROUP BY ROLLUP(period)
ORDER BY period;
我正在获取附件格式的数据:
很好。但是,我需要为他们每个人获得 %complete 。 例如 - 更新前“完成”百分比将是 2/28,即 7%;
我写了这个查询;
SELECT SUM(CASE WHEN period = '1-Pre Update' THEN 1 ELSE 0 END) AS value,
COUNT(taskid) AS max_value
FROM transition_tasks_new
WHERE status='Completed'
但它没有按预期工作。
SELECT X.*,
ROUND(X.COMPLETED / X.TOTAL * 100,
2) AS PERCENT_COMPLETE
FROM
(WITH SAMPLE_DATA AS
(SELECT '1-Pre-Update' AS PERIOD,
3 AS WIP,
2 AS COMPLETED,
23 AS NOT_STARTED) SELECT PERIOD,
SUM(WIP) AS WIP,
SUM(COMPLETED) AS COMPLETED,
SUM(NOT_STARTED) AS NOT_STARTED,
SUM(WIP + COMPLETED + NOT_STARTED) AS TOTAL
FROM SAMPLE_DATA
GROUP BY PERIOD) X
将数值除以总数再乘以100计算百分比:
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,
ROUND(COUNT(CASE status WHEN 'Completed' THEN 1 END)/COUNT(*) * 100, 3)
AS percent_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 1, 'Other' 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 PERCENT_COMPLETED WIP NOT_STARTED TOTAL 1 3 42.857 2 1 7 2 2 66.667 1 0 3 3 4 66.667 0 2 6 TOTAL 9 56.25 3 3 16
db<>fiddle here