sql - 接收 DB2 中列 SUM 的不同输出
问题描述
我在 DB2 中有下表:
COLUMN_NAME | 数据类型 | TYPE_NAME | COLUMN_SIZE | COLUMN_TEXT |
---|---|---|---|---|
DMPROD | -2 | CHAR () 用于位数据 | 35 | 产品代码 |
DMPTYP | -2 | CHAR () 用于位数据 | 1 | 期间类型 |
DMTYPE | -2 | CHAR () 用于位数据 | 6 | 数据类型 |
DMVL01 | 3 | 十进制 | 17 | 价值期 1 |
DMVL02 | 3 | 十进制 | 17 | 价值期 2 |
DMVL03 | 3 | 十进制 | 17 | 价值期 3 |
DMVL04 | 3 | 十进制 | 17 | 价值期 4 |
DMVL05 | 3 | 十进制 | 17 | 价值期 5 |
DMVL06 | 3 | 十进制 | 17 | 价值期 6 |
DMVL07 | 3 | 十进制 | 17 | 价值期 7 |
DMVL08 | 3 | 十进制 | 17 | 价值期 8 |
DMVL09 | 3 | 十进制 | 17 | 价值期 9 |
DMVL10 | 3 | 十进制 | 17 | 价值期 10 |
DMVL11 | 3 | 十进制 | 17 | 价值期 11 |
DMVL12 | 3 | 十进制 | 17 | 价值期 12 |
年 | 3 | 十进制 | 4 | 财政年度 |
下面的查询将返回每个周期类型的价值周期总和,将它们分组到产品代码中
SELECT
D.DMPROD,
Sum(D.DMVL01 + D.DMVL02 + D.DMVL03 + D.DMVL04 + D.DMVL05 + D.DMVL06) AS Total
FROM
DWM D
WHERE
D.DMYEAR IN (2022)
AND D.DMPTYP = 'M'
AND D.DMTYPE IN ('RTNQTY','SLSQTY')
GROUP BY
D.DMPROD
ORDER BY
1;
初始输出:
DMPROD | 全部的 |
---|---|
11105 | 1145.75000 |
11350 | 625.37400 |
13135 | 2270.50000 |
13282 | -0.27500 |
13344 | -1.03300 |
15105 | 784 |
然后,由于其他成员的反馈,我将其更改为使用子查询。这是首选格式:
SELECT
D.DMPROD,
(SLSQTY + RTNQTY) AS Total
FROM
(
SELECT
D.DMPROD,
Sum(CASE WHEN D.DMTYPE = 'RTNQTY' THEN Total END) AS RTNQTY,
Sum(CASE WHEN D.DMTYPE = 'SLSQTY' THEN Total END) AS SLSQTY
FROM
(
SELECT
D.*,
(D.DMVL01 + D.DMVL02 + D.DMVL03 + D.DMVL04 + D.DMVL05 + D.DMVL06) AS Total
FROM
DWM AS D
) AS D
WHERE
D.DMYEAR IN (2022)
AND D.DMPTYP = 'M'
GROUP BY
D.DMPROD
) AS D
ORDER BY 1;
但请注意总和不一样(初始输出是正确的):
DMPROD | 全部的 |
---|---|
11105 | 1145.75000 |
11350 | 625.37400 |
13135 | 2270.50000 |
13282 | |
13344 | |
15105 |
我在哪里犯了总和的错误?
解决方案
这些表达式:
Sum(CASE WHEN D.DMTYPE = 'RTNQTY' THEN Total END) AS RTNQTY,
Sum(CASE WHEN D.DMTYPE = 'SLSQTY' THEN Total END) AS SLSQTY
NULL
如果结果中没有 的行,则可以返回DMTYPE
。反过来,这会影响此计算:
(SLSQTY + RTNQTY) AS Total
最简单的解决方案是添加ELSE 0
:
Sum(CASE WHEN D.DMTYPE = 'RTNQTY' THEN Total ELSE 0 END) AS RTNQTY,
Sum(CASE WHEN D.DMTYPE = 'SLSQTY' THEN Total ELSE 0 END) AS SLSQTY
这避免了该NULL
值,因此总计算不会变成NULL
。
推荐阅读
- php - 获取接口的所有 Laravel artisan 命令
- macos - 在 Mac 上从源代码编译 Qt Creator 4.7.0 时未找到 qbs.h
- magento2 - 使用 composer (2.2.1 到 2.2.5) 升级 Magento 时出错
- java - 如何检查字符串是否包含给定字符串,而不是另一个给定字符串的一部分?
- reporting-services - 如何将小计的最大值分配给ssrs报告折线图中水平轴的间隔
- python - 将元素分配给列表中的列表
- ruby-on-rails - 允许未经确认的用户访问某些需要身份验证的页面
- c# - 价值分配是提高还是降低绩效还是什么都不做?
- visual-c++ - C++ 到 C# char[]
- class - v-for 中的 Vuejs 切换类