3

2つのテーブルTblinkreceiveingとTblinkdeliveryの2つのテーブルがあります。各インクコードの在庫残高を表示したいのですが、以下のSQL結合クエリを試しましたが、手動計算でクロスチェックすると、多くのインクコードで計算が間違っています。どこが間違っていましたか?

select r.inkcode, SUM(r.quantity) Stock-In, SUM(d.quantity) Stock-out, (SUM(r.quantity) - SUM(d.quantity)) Stock-Balance from Tblinkreceiving r,Tblinkdelivery d where r.inkcode=d.inkcode
group by r.inkcode;
4

2 に答える 2

0
WITH    i AS
        (
        SELECT  inkcode, SUM(quantity) AS qin
        FROM    tblInkReceiving
        GROUP BY
                inkcode
        ),
        o AS
        (
        SELECT  inkcode, SUM(quantity) AS qout
        FROM    tblInkDelivery
        GROUP BY
                inkcode
        )
SELECT  COALESCE(i.inkcode, o.inkcode) AS inkcode,
        COALESCE(qin, 0) AS stock_in,
        COALESCE(qout, 0) AS stock_out,
        COALESCE(qin, 0) - COALESCE(qout, 0) AS stock_balance
FROM    i
FULL JOIN
        o
ON      o.inkcode = i.inkcode
于 2012-04-24T08:42:09.993 に答える
0

内部結合(暗黙的)を使用して、受信と配信を組み合わせました。これは、受信されたが配信されなかったインクコードが結果から除外されることを意味します。

インクの配信にはインクレシートが必要であると想定できる場合(受け取っていないものは配信できないという前提に基づいて)、次のようにtblInkReceivingで内部結合を使用できます。

SELECT r.inkcode, 
    SUM(r.quantity) AS Stock-In, 
    ISNULL(SUM(d.quantity), 0) AS Stock-out,
    SUM(r.quantity) - ISNULL(SUM(d.quantity), 0) AS Stock-Balance 
FROM Tblinkreceiving r LEFT JOIN Tblinkdelivery d ON r.inkcode = d.inkcode
GROUP BY r.inkcode

左結合は、右(d)の一致するレコードを含む、左(r)のすべてのレコードを返します。dに一致するレコードがない場合(つまり、そのインクコードのインク配信がない場合)、それらの行の値はnullになります。

インクを受け取ってからしか配信できないと想定できない場合は、インクテーブル(つまり、インクコードが主キーであるテーブル)にもリンクするか、すべてのインクコードを結合する必要があります。受信テーブルと配信テーブルで、それにリンクします。

;WITH cte AS (SELECT inkcode FROM Tblinkreceiving 
    UNION 
    SELECT inkcode FROM Tblinkdelivery)
SELECT cte.inkcode, 
    SUM(r.quantity) AS Stock-In, 
    ISNULL(SUM(d.quantity), 0) AS Stock-out,
    SUM(r.quantity) - ISNULL(SUM(d.quantity), 0) AS Stock-Balance 
FROM cte LEFT JOIN Tblinkreceiving r ON cte.ink_code = r.ink_code
    LEFT JOIN Tblinkdelivery d ON cte.inkcode = d.inkcode
GROUP BY cte.inkcode
于 2012-04-24T09:27:57.177 に答える