db2 将多个SUM(CASE)添加到同一列

q3qa4bjr  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(199)

在DB2中有以下表:
| 数据行名称|数据类型|类型名称|栏_大小|列_文本|
| - -|- -|- -|- -|- -|
| 年|三个|小数位|四个|会计年度|
| DMY类型|-2个|位数据的CHAR()|一个|年度类型|
| 数据类型|-2个|位数据的CHAR()|一个|期间类型|
| DM类型|-2个|位数据的CHAR()|六个|数据类型|
| DMPROD公司|-2个|位数据的CHAR()|三十五个|产品型号|
| DMVL 01型|三个|小数位|十七岁|价值期间1|
| DMVL 02型|三个|小数位|十七岁|价值期间2|
| DMVL 03型|三个|小数位|十七岁|价值期间3|
| DMVL 04型|三个|小数位|十七岁|价值期间4|
| DMVL 05型汽车|三个|小数位|十七岁|价值期间5|
| DMVL 06型|三个|小数位|十七岁|价值期间6|
| DMVL 07车型|三个|小数位|十七岁|价值期间7|
| DMVL 08型|三个|小数位|十七岁|价值期间8|
| DMVL 09车型|三个|小数位|十七岁|价值期间9|
| DMVL 10型|三个|小数位|十七岁|价值期间10|
| DMVL 11型汽车|三个|小数位|十七岁|价值期间11|
| DMVL 12型汽车|三个|小数位|十七岁|价值期间12|
值期间为一月至二月,可以汇总每个月的各种数据类型,如下所示:

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

它会产生如下输出:
| 年|数据类型|DMPROD公司|成本费用|成本费用|成本费用|RTNCST系统|RTNCST系统|RTNCST系统|
| - -|- -|- -|- -|- -|- -|- -|- -|- -|
| 二〇一〇年|米|小行星1110| 435798.00000欧元|441252.00000美元|479774.00000欧元| -2921.00000 |万分之一|万分之一|
| 二〇一〇年|米|小行星11350| 538938.00000美元|593764.00000美元|511088.00000美元| -4074.00000 | -2503.00000 |万分之一|
| 二〇一〇年|米|小行星11364| 2905557.00000美元|3167448.00000美元|3534924.00000欧元| -5691.00000 |万分之一|万分之一|
| 二〇一〇年|米|小行星11374|小行星854274.00000| 829392.00000美元|||||
但我想为月份创建一个新列,表示1-12,并调整总和以生成相应的值,因此它看起来像这样:
| 年|月|数据类型|DMPROD公司|成本费用|RTNCST系统|
| - -|- -|- -|- -|- -|- -|
| 二〇一一年|一个|米|小行星1110|小行星278021.00000| -7522.00000 |
| 二〇一一年|2个|米|小行星1110| 615232.00000美元| -938.00000 |
| 二〇一一年|三个|米|小行星1110| 2153272.00000美元| -2805.00000 |
我认为使用子查询是可能的,但请记住,我有8-9个不同的DMTYPE,所以我希望有一个更优雅的解决方案,而不是每个DMTYPE生成9个case语句。

k10s72fa

k10s72fa1#

尝试将相应的表达式添加到内部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

相关问题