使用多个表达式或多个解码的Oracle解码

im9ewurl  于 2022-09-18  发布在  Java
关注(0)|答案(1)|浏览(148)

我在一个Oracle表中有以下数据,我正在尝试基于类型和Qt列执行计算。

TYPE QT STATUS  CNT
---- -- ------  ---
E    A  YES     123
E    A  NO     2540
E    D  YES       2
E    D  NO      787
O    A  YES     884
O    A  NO     6957
O    D  YES      25
O    D  NO     1360

看起来我现在的预期产量不一样了..如下所示:

TYPE    TOTAL   A   A&Y
----    -----   ----    -----
E+O     12678   10504   1007
E       3452     2663    123

我的旧Oracle SQL如下,但在计算百分比时输出错误:

SELECT * FROM (
    SELECT NVL(SUM(DECODE(A.QT,'A',A.CNT,'D',A.CNT)),0) AS "TOTAL",
    NVL(SUM(DECODE(A.QT,'A',A.CNT)),0) AS "A ALL",
    NVL(SUM(DECODE(A.QT,'A',ROUND(100*(NVL(A.CNT,0)/ A.CNT),2))),0) "A ALL %",
    NVL(SUM(DECODE(A.STATUS,'E',A.CNT)),0) AS "E TOTAL",
    NVL(SUM(DECODE(A.STATUS,'E',DECODE(A.QT,'A',A.CNT))),0) AS "E & A TOTAL"",
    NVL(SUM(DECODE(A.STATUS,'E',ROUND(100 * SUM((DECODE(A.QT,'A',A.CNT)) / SUM(A.CNT)),3))),0) "E & A %"
    FROM ALLIN A)
nnt7mjpx

nnt7mjpx1#

您可以使用公用表表达式以更具可读性的方式重写查询;

WITH cte AS (
  SELECT 
    SUM(cnt) total,
    SUM(DECODE(qt,   'A', cnt, 0))      a_all,
    SUM(DECODE(type, 'E', cnt, 0))      e_total,
    SUM(DECODE(type||qt, 'EA', cnt, 0)) ea_total
  FROM allin
)
SELECT 
  total, a_all, ROUND(a_all/total*100, 2) a_percent,
  e_total, ea_total, ROUND(ea_total/e_total*100, 2) ea_percent
FROM cte;

该查询生成预期的结果,并且更易于阅读和调试。EA部分假设qt和type都是一个字母,因此它们的串联与EA匹配。如果这不是真的,我建议使用CASE,a‘la;

SUM(CASE WHEN type = 'E' AND qt = 'A' THEN cnt ELSE 0 END) ea_total

用于测试的SQLfiddle。

相关问题