【发布时间】: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