1

次のSQLを使用して、受け取った合計金額と3つのテーブルから販売した合計金額を取得しようとしています。

select ITEMS.ITEM_NO, SUM(RECEIVINGS.QTY_RECVD), SUM(SALES.QTY_SOLD)
from ITEMS
left join RECEIVINGS
on ITEMS.ITEM_NO = RECEVINGS.ITEM_NO
left join SALES
on ITEMS.ITEM_NO = SALES.ITEM_NO
WHERE ITEMS.ITEM_NO = '12345'
GROUP BY ITEMS.ITEM_NO

上記のクエリは、実際の値よりも数桁大きいデータを返します。ただし、2つのクエリに分割すると、次のようになります。

select ITEMS.ITEM_NO, SUM(RECEIVINGS.QTY_RECVD)
from ITEMS
left join RECEIVINGS
on ITEMS.ITEM_NO = RECEVINGS.ITEM_NO
WHERE ITEMS.ITEM_NO = '12345'
GROUP BY ITEMS.ITEM_NO


select ITEMS.ITEM_NO, SUM(SALES.QTY_SOLD)
from ITEMS
left join SALES
on ITEMS.ITEM_NO = SALES.ITEM_NO
WHERE ITEMS.ITEM_NO = '12345'
GROUP BY ITEMS.ITEM_NO

それは完璧に動作します。何が得られますか?3つのテーブルすべてを結合する最初のクエリが機能しない理由はありますが、2つの別々のクエリは機能しますか?

4

1 に答える 1

7

いずれかreceivingsまたはsales複数の行がある場合(特に両方に複数の行がある場合)、値はそれぞれ、他の行の数で乗算されます。この問題を解決する1つの方法は、合計を個別に計算してから結合することです。

select ITEMS.ITEM_NO, COALESCE(R.SUM_RECEIVINGS,0), COALESCE(S.SUM_SALES,0)
from ITEMS
left join (SELECT RECEIVINGS.ITEM_NO, SUM(RECEIVINGS.QTY_RECVD) as SUM_RECEIVINGS
    FROM RECEIVINGS
    GROUP BY RECEIVINGS.ITEM_NO) as R ON ITEMS.ITEM_NO = R.ITEM_NO
left join (SELECT SALES.ITEM_NO, SUM(SALES.QTY_RECVD) as SUM_SALES
    FROM SALES
    GROUP BY SALES.ITEM_NO) as S ON ITEMS.ITEM_NO = S.ITEM_NO
WHERE ITEMS.ITEM_NO = '12345'
于 2012-04-09T15:00:01.923 に答える