首页 > 解决方案 > 接收 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

我在哪里犯了总和的错误?

标签: sqlsumdb2aggregates

解决方案


这些表达式:

    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


推荐阅读