0

2 つの進行状況データベース クエリがあり、それらを 1 つのステートメントにマージしようとしていますが、エラーが発生します。これらの各クエリは単純に数値を返します。これら 2 つの数値を合計したいと思います。それか、最初から別のクエリを作成してください。どちらも「DM1」の一連の値コードを受け取り、どちらも 1 つの「製品」を受け入れます。

クエリ 1

SELECT SUM(opn3.samt)
    FROM PUB.ord ord3, PUB.opn opn3
    WHERE
    ord3.subsnum = opn3.subsnum
    AND ord3.onum = opn3.onum
    AND ord3.DM1 != ''
    AND ord3.DM1 IN('XCWAJC25','WCWAMO73') 
    AND ord3.prdcde = 'CSC' 
    AND ord3.stat != 16
    AND opn3.samt >= 0
    GROUP BY ord3.DM1, ord3.prdcde

クエリ 2

SELECT SUM((-1 * opn2.samt) + ord2.samt)
    FROM PUB.ord ord2, PUB.opn opn2
    WHERE
    ord2.subsnum = opn2.subsnum
    AND ord2.onum = opn2.onum
    AND ord2.DM1 != ''
    AND ord2.DM1 IN('XCWAJC25','WCWAMO73') 
    AND ord2.prdcde = 'CSC' 
    AND ord2.stat = 16
    AND opn2.samt < 0
    GROUP BY ord2.DM1, ord2.prdcde

これまでのマージ試行...

SELECT SUM(opn3.samt + (SELECT SUM((-1 * opn2.samt) + ord2.samt)
    FROM PUB.ord ord2, PUB.opn opn2
    WHERE
    ord2.subsnum = opn2.subsnum
    AND ord2.onum = opn2.onum
    AND ord2.DM1 != ''
    AND ord2.DM1 = ord3.DM1
    AND ord2.prdcde = ord3.prdcde 
    AND ord2.stat = 16
    AND opn2.samt < 0
    GROUP BY ord2.DM1, ord2.prdcde
)) as foo

    FROM PUB.ord ord3, PUB.opn opn3
    WHERE
    ord3.subsnum = opn3.subsnum
    AND ord3.onum = opn3.onum
    AND ord3.DM1 != ''
    AND ord3.DM1 IN('XCWAJC25','WCWAMO73') 
    AND ord3.prdcde = 'CSC' 
    AND ord3.stat != 16
    AND opn3.samt >= 0
    GROUP BY ord3.DM1, ord3.prdcde

ありがとう

4

2 に答える 2

1

これでうまくいくと思いますが、検証用のサンプル データがあると便利です。

SELECT COALESCE(SUM(a.samt), 0) - COALESCE(SUM(b.samt), 0)
       + COALESCE(SUM(CASE WHEN ord.stat = 16
                                AND b.samt < 0
                           THEN ord.samt END), 0)
FROM PUB.ord ord
LEFT JOIN PUB.opn a
       ON a.subsnum = ord.subsnum
          AND a.onum = ord.onum
          AND a.samt >= 0
          AND ord.stat != 16
LEFT JOIN PUB.opn b
          ON b.subsnum = ord.subsnum
             AND b.onum = ord.onum
             AND b.samt < 0
             AND ord.stat = 16
WHERE ord.DM1 IN('XCWAJC25', 'WCWAMO73') 
      AND ord.prdcde = 'CSC'
GROUP BY ord.DM1

クエリ/スタッフに関する注意事項:

  • FROM常に結合を明示的に修飾し、コンマ区切り句を使用しないでください
  • ord.DM1 != ''値が特定のセットに含まれている必要があるため、必要はないと思います
  • LEFT JOIN節の代わりに節を条件に入れるとWHERE、わずかに異なる効果があります。フィルタリングの代わりに、結合に条件を追加します。これは、実際の行が必要かどうかに関係なく、左側のテーブルの何かに基づいて行を除外できることを意味します (これがsord.statで終わった理由LEFT JOINです)。 INNER JOINs は技術的には同じように動作しますが、右側のテーブルを除外すると左側のテーブルも除外されるため、通常は目立ちません。
于 2013-01-11T17:24:20.120 に答える
0

個々のクエリが意図したとおりに機能することを考えると、これでうまくいくはずです。

SELECT sum1.tot + sum2.tot 
FROM  
(SELECT SUM(opn3.samt) as tot
FROM PUB.ord ord3, PUB.opn opn3
WHERE
ord3.subsnum = opn3.subsnum
AND ord3.onum = opn3.onum
AND ord3.DM1 != ''
AND ord3.DM1 IN('XCWAJC25','WCWAMO73') 
AND ord3.prdcde = 'CSC' 
AND ord3.stat != 16
AND opn3.samt >= 0
GROUP BY ord3.DM1, ord3.prdcde) sum1,

(SELECT SUM((-1 * opn2.samt) + ord2.samt) as tot
FROM PUB.ord ord2, PUB.opn opn2
WHERE
ord2.subsnum = opn2.subsnum
AND ord2.onum = opn2.onum
AND ord2.DM1 != ''
AND ord2.DM1 IN('XCWAJC25','WCWAMO73') 
AND ord2.prdcde = 'CSC' 
AND ord2.stat = 16
AND opn2.samt < 0
GROUP BY ord2.DM1, ord2.prdcde) sum2
于 2013-01-11T16:24:14.677 に答える