-1

我有这样的 Oracle SQL:

SELECT 
           DOU$2.CUSTCD AS CUSTCD, 
           DOU$2.CHUNO AS CHUNO, 
           DOU$2.LINNO AS LINNO, 
           DOU$2.SHIPDAYYM AS SHIPDAYYM, 
           sum(DOU$2.NOUKN) AS NOUKN, 
           sum(DOU$2.ZEIKN) AS ZEIKN, 
           sum(
              CASE DOU$2.ZEIRITSU
                 WHEN 
                    (
                       SELECT V_KZEIRITSU.ZEIRITSU
                       FROM SDNISHI.V_KZEIRITSU
                    ) THEN DOU$2.NOUKN
                 ELSE 0
              END) AS NOUKN2
           
        FROM 
           SDNISHI.T_HCHUMON_DOUSOU  AS DOU$2 
              INNER JOIN SDNISHI.SY_KANRI  AS KNR 
              ON KNR.SHIPDAYYM = DOU$2.SHIPDAYYM 
              INNER JOIN SDNISHI.T_HCHUMON_MEI  AS MEI 
              ON 
                 MEI.CUSTCD = DOU$2.CUSTCD AND 
                 MEI.CHUNO = DOU$2.CHUNO AND 
                 MEI.LINNO = DOU$2.LINNO AND 
                 MEI.SHIPDAYYM = DOU$2.SHIPDAYYM AND 
                 MEI.USEDNGKBN = '0' AND 
                 MEI.CANCELKBN = '0' 
              LEFT OUTER JOIN SDNISHI.T_HCHUMON_HD  AS HD 
              ON 
                 HD.CUSTCD = MEI.CUSTCD AND 
                 HD.CHUNO = MEI.CHUNO AND 
                 HD.LINNO = MEI.LINNO AND 
                 HD.USEDNGKBN = '0' AND 
                 HD.CANCELKBN = '0' AND 
                 isnull(HD.CANKBN, '00') = '00'
        WHERE 
           DOU$2.USEDNGKBN = '0' AND 
           DOU$2.CANCELKBN = '0' AND 
           ((
           MEI.CHGDELKBN = '1' AND 
           MEI.HDOUSOUKBN = '02' AND 
           (MEI.CHUSU > 0 OR MEI.BCHUSU > 0)) OR (
           MEI.CHGDELKBN != '1' AND 
           HD.HDOUSOUKBN = '02' AND 
           (MEI.CHKBTNFGA = '1' AND HD.CHUSU > 0) OR (MEI.CHKBTNFGB = '1' AND HD.BCHUSU > 0)))
        GROUP BY 
           DOU$2.CUSTCD, 
           DOU$2.CHUNO, 
           DOU$2.LINNO, 
           DOU$2.SHIPDAYYM

也就是说,代码是由 SSMA(从 Oracle 迁移到 SQL)创建的,并且无法运行。

我已经尝试像这样转换:

sum(
              CASE 
                 WHEN 
                   DOU$2.ZEIRITSU in  (
                       SELECT V_KZEIRITSU.ZEIRITSU
                       FROM SDNISHI.V_KZEIRITSU
                    ) THEN DOU$2.NOUKN
                 ELSE 0
              END) AS NOUKN2

但这给了我错误:

无法对包含聚合或子查询的表达式执行聚合函数

谁能帮帮我

4

4 回答 4

0

你的代码很奇怪。例如,它似乎假设V_KZEIRITSU有一行。但是,您可以将其移至FROM子句:

SELECT SUM(CASE WHEN DOU.ZEIRITSU = K.ZEIRITSU THEN DOU.NOUKN ELSE 0 END)  AS NOUKN2
FROM DOU LEFT JOIN
     V_KZEIRITSU K
     ON 1=1   -- in case the table is really empty

一个稍微更合理的版本是:

SELECT SUM(DOU.NOUKN) AS NOUKN2
FROM DOU LEFT JOIN
     V_KZEIRITSU K
     ON DOU.ZEIRITSU = K.ZEIRITSU  -- in case the table is really empty

在我看来,这不太可能是你真正想要的。如果不是,我建议您使用适当的相同数据、所需结果和结果解释提出一个新问题。不应期望非工作查询提供相同级别的信息。

于 2021-01-11T12:24:47.513 回答
0

只需将您的sum逻辑移动到 select 中,如下所示:

 (SELECT SUM(DOU$2.NOUKN) 
   FROM SDNISHI.V_KZEIRITSU V
  WHERE DOU$2.ZEIRITSU = V.ZEIRITSU) AS NOUKN2

如果它给出聚合错误,则使用sum(above query) AS NOUKN2

于 2021-01-11T11:09:45.213 回答
0

您的内部选择返回一个表格。这不能用作匹配WHERE IN条件的参数。而是尝试使用INNER JOIN

sum(decode(
    select sum(dou.noukn)
    from dou
    join v_kzeiritsu on 
         dou.zeiritsu = v_kzeiritsu.zeiritsu
)) as noukn2;
于 2021-01-11T10:55:31.397 回答
0

我会说它实际上很简单

select sum(dou.noukn) 
from dou
where dou.zeiritsu in (select zeiritsu from v_kzeiritsu)

(我不确定dou(表?别名?)是什么,但我希望你知道。)


编辑问题后,我正在编辑答案。我用“ --> this”标记了两行 - 在我看来 - 可能会有所帮助。如前所述,整体sum(case ...) as noukn2被简单的sum(dou$2.noukn).

请注意,在 Oracle 中,您不能使用as关键字作为表别名。例如:

  • 不:from employees as e
  • 是的:from employees e

这是您的查询:

  SELECT DOU$2.CUSTCD AS CUSTCD,
         DOU$2.CHUNO AS CHUNO,
         DOU$2.LINNO AS LINNO,
         DOU$2.SHIPDAYYM AS SHIPDAYYM,
         SUM (DOU$2.NOUKN) AS NOUKN,
         SUM (DOU$2.ZEIKN) AS ZEIKN,
         SUM (dou$2.noukn) AS noukn2                          --> this
    FROM SDNISHI.T_HCHUMON_DOUSOU DOU$2
         INNER JOIN SDNISHI.SY_KANRI KNR ON KNR.SHIPDAYYM = DOU$2.SHIPDAYYM
         INNER JOIN SDNISHI.T_HCHUMON_MEI MEI
            ON     MEI.CUSTCD = DOU$2.CUSTCD
               AND MEI.CHUNO = DOU$2.CHUNO
               AND MEI.LINNO = DOU$2.LINNO
               AND MEI.SHIPDAYYM = DOU$2.SHIPDAYYM
               AND MEI.USEDNGKBN = '0'
               AND MEI.CANCELKBN = '0'
         LEFT OUTER JOIN SDNISHI.T_HCHUMON_HD HD
            ON     HD.CUSTCD = MEI.CUSTCD
               AND HD.CHUNO = MEI.CHUNO
               AND HD.LINNO = MEI.LINNO
               AND HD.USEDNGKBN = '0'
               AND HD.CANCELKBN = '0'
               AND isnull (HD.CANKBN, '00') = '00'
         JOIN v_keziritsu vk ON vk.zeiritsu = dou$2.zeiritsu  --> this
   WHERE     DOU$2.USEDNGKBN = '0'
         AND DOU$2.CANCELKBN = '0'
         AND (   (    MEI.CHGDELKBN = '1'
                  AND MEI.HDOUSOUKBN = '02'
                  AND (   MEI.CHUSU > 0
                       OR MEI.BCHUSU > 0))
              OR (       MEI.CHGDELKBN != '1'
                     AND HD.HDOUSOUKBN = '02'
                     AND (    MEI.CHKBTNFGA = '1'
                          AND HD.CHUSU > 0)
                  OR (    MEI.CHKBTNFGB = '1'
                      AND HD.BCHUSU > 0)))
GROUP BY DOU$2.CUSTCD,
         DOU$2.CHUNO,
         DOU$2.LINNO,
         DOU$2.SHIPDAYYM
于 2021-01-11T10:15:08.430 回答