在DB2中接收列SUM的不同输出

jobtbby3  于 2022-11-07  发布在  DB2
关注(0)|答案(2)|浏览(216)

在DB2中有以下表:
| 数据行名称|数据类型|类型名称|栏_大小|列_文本|
| - -|- -|- -|- -|- -|
| DMPROD公司|-2个|位数据的CHAR()|三十五个|产品型号|
| 数据类型|-2个|位数据的CHAR()|一个|期间类型|
| DM类型|-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
    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公司|总计|
| - -|- -|
| 小行星1110| 1145.75千元|
| 小行星11350| 625.37400英镑|
| 小行星13135| 2270.50000欧元|
| 小行星13282| -0.27500 |
| 小行星13344| -1.03300 |
| 小行星15105|七百八十四人|
然后,我根据其他成员的反馈,将其改为使用子查询。这是首选格式:

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公司|总计|
| - -|- -|
| 小行星1110| 1145.75千元|
| 小行星11350| 625.37400英镑|
| 小行星13135| 2270.50000欧元|
| 小行星13282||
| 小行星13344||
| 小行星15105||
我在哪里做错了算术题?

ruarlubt

ruarlubt1#

这些表达式:

Sum(CASE WHEN D.DMTYPE = 'RTNQTY' THEN Total END) AS RTNQTY,
    Sum(CASE WHEN D.DMTYPE = 'SLSQTY' THEN Total END) AS SLSQTY

如果结果中没有DMTYPE的行,则可以返回NULL。这反过来会影响以下计算:

(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

ny6fqffe

ny6fqffe2#

可能会出现这样的情况:某些DMPROD组不包含具有某些DMTYPE.SUM的行,这种类型的SUM为NULL,如果在+运算符中使用这样的值,则结果为NULL。
您可以按原样检查以下示例:

SELECT
  DMPROD
, RTNQTY
, SLSQTY
, RTNQTY + SLSQTY AS TOTAL_new 
, TOTAL_orig
, COALESCE (RTNQTY, 0) + COALESCE (SLSQTY, 0) AS TOTAL_mustbe 
FROM
(
SELECT
  DMPROD
, SUM (CASE WHEN DMTYPE = 'RTNQTY' THEN Total END) AS RTNQTY
, SUM (CASE WHEN DMTYPE = 'SLSQTY' THEN Total END) AS SLSQTY
, SUM (Total) AS TOTAL_orig
FROM 
(
VALUES
  (1, 'RTNQTY', 1)
, (1, 'SLSQTY', 1)
, (2, 'RTNQTY', 1)
) MY_TAB (DMPROD, DMTYPE, Total)
GROUP BY DMPROD
);

其结果是:
| DMPROD公司|即时数量|自定义|总计_新|合计_原始|总计_必须|
| - -|- -|- -|- -|- -|- -|
| 一个|一个|一个|2个|2个|2个|
| 2个|一个|||一个|一个|

相关问题