【问题标题】:Adding Multiple SUM(CASE)s to Same Column将多个 SUM(CASE) 添加到同一列
【发布时间】:2021-10-29 10:24:10
【问题描述】:

我在 DB2 中有下表:

COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE COLUMN_TEXT
DMYEAR 3 DECIMAL 4 Fiscal Year
DMYTYP -2 CHAR () FOR BIT DATA 1 Year Type
DMPTYP -2 CHAR () FOR BIT DATA 1 Period Type
DMTYPE -2 CHAR () FOR BIT DATA 6 Type of Data
DMPROD -2 CHAR () FOR BIT DATA 35 Product Code
DMVL01 3 DECIMAL 17 Value Period 1
DMVL02 3 DECIMAL 17 Value Period 2
DMVL03 3 DECIMAL 17 Value Period 3
DMVL04 3 DECIMAL 17 Value Period 4
DMVL05 3 DECIMAL 17 Value Period 5
DMVL06 3 DECIMAL 17 Value Period 6
DMVL07 3 DECIMAL 17 Value Period 7
DMVL08 3 DECIMAL 17 Value Period 8
DMVL09 3 DECIMAL 17 Value Period 9
DMVL10 3 DECIMAL 17 Value Period 10
DMVL11 3 DECIMAL 17 Value Period 11
DMVL12 3 DECIMAL 17 Value Period 12

数值周期为1-2月,可以总结每个月的各种数据类型,如下所示:

SELECT 
DMYEAR,
DMPTYP,
DMPROD,
Sum(CASE WHEN DMTYPE = 'COST' THEN DMVL01 ELSE 0 END) AS COST,
Sum(CASE WHEN DMTYPE = 'COST' THEN DMVL02 ELSE 0 END) AS COST,
Sum(CASE WHEN DMTYPE = 'COST' THEN DMVL03 ELSE 0 END) AS COST,
Sum(CASE WHEN DMTYPE = 'RTNCST' THEN DMVL01 ELSE 0 END) AS RTNCST,
Sum(CASE WHEN DMTYPE = 'RTNCST' THEN DMVL02 ELSE 0 END) AS RTNCST,
Sum(CASE WHEN DMTYPE = 'RTNCST' THEN DMVL03 ELSE 0 END) AS RTNCST
FROM DWM
WHERE DMPTYP = 'M' 
GROUP BY DMYEAR, DMPTYP, DMPROD
ORDER BY 1, 3

产生这样的输出:

DMYEAR DMPTYP DMPROD COST COST COST RTNCST RTNCST RTNCST
2010 M 11105 435798.00000 441252.00000 479774.00000 -2921.00000 0.00000 0.00000
2010 M 11350 538938.00000 593764.00000 511088.00000 -4074.00000 -2503.00000 0.00000
2010 M 11364 2905557.00000 3167448.00000 3534924.00000 -5691.00000 0.00000 0.00000
2010 M 11374 854274.00000 829392.00000

但我想为月份创建一个新列,表示 1-12 并调整总和以产生相应的值,使其看起来像这样:

DMYEAR DMMONTH DMPTYP DMPROD COST RTNCST
2011 1 M 11105 278021.00000 -7522.00000
2011 2 M 11105 615232.00000 -938.00000
2011 3 M 11105 2153272.00000 -2805.00000

我认为子查询是可能的,但请记住,我有 8-9 种不同的 DMTYPE,所以我希望有一个比为每个 DMTYPE 制作 9 个 case 语句更优雅的解决方案。

【问题讨论】:

    标签: sql db2 db2-400 aggregates


    【解决方案1】:

    尝试将相应的表达式添加到内部 CASE 以获得所有 12 个 (x, DMVLx) 对:

    WITH 
      T (DMMONTH) AS (VALUES 1 UNION ALL SELECT DMMONTH + 1 FROM T WHERE DMMONTH < 12)
    SELECT 
      DMYEAR, DMMONTH, DMPTYP, DMPROD
    , Sum (CASE WHEN DMTYPE = 'COST'   THEN CASE DMMONTH WHEN 1 THEN DMVL01 WHEN 2 THEN DMVL02 ... WHEN 12 THEN DMVL12 END ELSE 0 END) AS COST
    , Sum (CASE WHEN DMTYPE = 'RTNCST' THEN CASE DMMONTH WHEN 1 THEN DMVL01 WHEN 2 THEN DMVL02 ... WHEN 12 THEN DMVL12 END ELSE 0 END) AS RTNCST
    FROM DWM, T
    WHERE DMPTYP = 'M' 
    GROUP BY DMYEAR, DMMONTH, DMPTYP, DMPROD
    ORDER BY 1, 3
    

    【讨论】:

    • 嗯,我不经常使用 DECODE,但您的示例应该可以。我在 DB2 中遇到错误,但是“[SQL0204] DECODE in *LIBL type *N not found.”
    • DB2 for IBM i 没有 DECODE 函数。如果您使用它,您应该使用db2-400 标签标记您的问题。我用等效的CASE 表达式更改了答案。
    猜你喜欢
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多