总计 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