2016-05-04 10 views
0

"Sales Line"または "Warehouse Entry"テーブルに関するすべての行をコメントアウトすると、クエリは期待通りに機能します。しかし、私はこのクエリをそのまま使用します。エラー(非現実的には少なくとも5桁高い)のデータを返します。2テーブルのデータを合計して1つのテーブルに結合したままにするにはどうすればよいですか?

アイデアは、「Item」テーブルを繰り返し、販売量と販売量の合計とそれが価値があることを確認することです。私はこれらのテーブルに参加する方法で何か間違っていると思う。 「倉庫エントリ」テーブルと「販売ライン」テーブルの両方には、I.[No_]にリンクできる複数のエントリがあります。

USE NAV2009_R2_SHOWTEX_LIVE 

SELECT I.[No_] 
    ,sum(S.[Quantity (Base)]) AS [Quantity Sold] 
    ,min(I.[IP Total (Manual)]) * sum(WE.[Quantity]) AS [Stock Value] 
    ,sum(WE.[Quantity]) AS [Quantity Stock] 
FROM [Item] AS I 
INNER JOIN [Warehouse Entry] AS WE ON WE.[Item No_] = I.[No_] 
    AND WE.[Location Code] = 'BU' 
    AND WE.[Bin Code] <> 'SHIPPING' 
    AND WE.[Bin Code] <> 'WORKSHOP' 
    AND WE.[Bin Code] <> 'OUTBOX' 
    AND WE.[Bin Code] <> 'CUT' 
    AND WE.[Bin Code] <> 'VERZEND' 
INNER JOIN [Sales Line] AS S ON S.[No_] = I.[No_] 
    AND S.[Shipment Date] > '07/01/2015' 
    AND S.[Document Type] = 1 
WHERE I.[No_] LIKE '140003000007' 
GROUP BY I.[No_] 

サンプルデータ

号|販売数量|株式価値|数量ストック

間違ったデータ

140003000007|204484537.36000000000000000000|13051602.124400| 2355884.86000000000000000000 

正しいデータ

140003000007|61703.24000000000000000000|13623.801800|2459.17000000000000000000 
+0

WEとS条件をON句に移して、真の左結合動作を得ます。 – jarlh

+0

@jarlh、ありがとうございますが、数字はまだ間違っています。私のコードを編集します – WouldBeNerd

+0

サンプルデータを投稿して結果を期待できますか? –

答えて

2
SELECT sumQuantityBase as [Quantity Sold], 
     minIP * sumQuantityBase as [Stock Value], 
     sumQuantityBase as [Quantity Stock] 
FROM 
    (SELECT MIN(I.[IP Total (Manual)])as minIP, 
      No_ 
    FROM I 
    WHERE [No_] like '140003000007' 
    GROUP BY No_) MinI INNER JOIN 
    (SELECT SUM([Quantity]) as sumQuantity, 
      [Item No_] 
    FROM WE 
    WHERE [Location Code] = 'BU' 
     AND [Bin Code] <> 'SHIPPING' 
     AND [Bin Code] <> 'WORKSHOP' 
     AND [Bin Code] <> 'OUTBOX' 
     AND [Bin Code] <> 'CUT' 
     AND [Bin Code] <> 'VERZEND'  
     GROUP BY [Item No_]) SumWE 
    ON MinI.[No_] = SumWE[Item No_] INNER JOIN 
    (SELECT SUM([Quantity (Base)]) as sumQuantityBase, 
      No_ 
    FROM S 
    WHERE [Shipment Date] > '07/01/2015' 
    AND [Shipment Date] IS NOT NULL 
    AND [Document Type] = 1 
    GROUP BY No_) SumS 
ON SumS.[No_] = MinI.[No_] 

これを試してください。あなたが合計または分の関数を使用してデータを集計する場合は、私はあなたがサブセットでそれを行うことをお勧めしたいと思います。あなたはそれを単純に保つようにします。

+0

あまりにも多くのネストされたクエリ。クエリが複数回再実行されなければならない場合、良いことはできません。 – Eon

+0

いいえ、それはいいです。すべての単一のサブセットは、where句がサブセット内でのみ定義されるため、必要な結果のみを返します。 1レベルのレベルのネスティングがあり、とにかくあなたを脅かすべきではありません。 – sapi

+0

ありがとう@サピ、あなたはクエリが働いています、私はこことそこにいくつかのものを変更しなければならなかったが、あなたがそれを書いた速度と私を取っていた時間の量で、私は贈り物を見ていない口の中の馬。 :) – WouldBeNerd

関連する問題