2015-12-09 28 views
0

我需要幫助。按約會條件加入3張桌子

TBL:WarehouseInventory

Date  | DelRec | ProductId | Quantity 
2015-09-10 | 110 | 1   | 100 
2015-09-12 | 111 | 1   | 100 
2015-09-12 | 111 | 2   | 200 
2015-09-12 | 111 | 3   | 300 

TBL:取款

Date  | ID  | ProductId | Quantity | CustomerId 
2015-09-11 | 1  | 1   | 400  | 2 
2015-09-12 | 1  | 1   | 100  | 1 
2015-09-12 | 2  | 2   | 200  | 1 
2015-09-12 | 3  | 3   | 300  | 1 

TBL:客戶

Customer Id  | Name 
1    | Somebody 
2    | Someone 

輸出應該是這樣的

DelRec | Date Added | ProductId | Stocked | Withdrawn | Customer 
    110 | 2015-09-10 | 1   | 100  | 0   | NULL 
    0 | 2015-09-11 | 1   | 0  | 400  | Someone 
    111 | 2015-09-12 | 1   | 100  | 100  | Somebody 
    111 | 2015-09-12 | 2   | 200  | 200  | Somebody 
    111 | 2015-09-12 | 3   | 300  | 300  | Somebody 

這就是我來了這麼遠,它給了我一個錯誤的輸出

select wi.DateAdded as 'Date Added', max(wi.DeliveryReceipt) as 'Delivery Receipt', wi.ProductId as 'Product', 
    max(isnull(wi.Quantity, 0)) as 'Stocked', max(isnull(w.Quantity, 0)) as 'Withdrawn', e.Customers as 'Customer' 
    from WarehouseInventory wi 
    cross join Withdrawals w 
    cross join Customer e 
    group by wi.DateAdded, wi.ProductId, e.Customers, wi.DeliveryReceipt, w.ProductId 

基本上,我需要加入的日期和產品這兩個表,如果有在一個空值表,只是讓它0.我感謝您的幫助。

回答

1

你有你的示例表和您的查詢之間的一些不一致的地方,但這裏的基本要點是:

  • 你要FULL OUTER JOIN您的倉庫在產品和日期上交貨(A)和提款(B)表
  • 確保您爲日期和產品合併(A,B)
  • Sum th從每個表中抽取數量,然後聚集到每個聚集外部以獲得零(因爲一列可以是全部空值)。

這裏:

​​
+0

您的解決方案有效!謝謝!我只是複製你的解決方案,改變了一些字段名稱,除了一個之外,它給了我正確的輸出;所有的客戶都是NULL,我無法讓它工作。我必須爲我研究這個新的關鍵詞......「聯盟」。再次感謝! – Ibanez1408

2

您可以使用FULL OUTER JOIN

SELECT DelRec, 
     COALESCE(wi.[Date], wd.[Date]) AS Date_Added, 
     COALESCE(wi.ProductId, wd.ProductId) AS ProductId, 
     COALESCE(wi.Quantity, 0) AS Stocked, 
     COALESCE(wd.Quantity, 0) AS Withdrawn, 
     c.Name AS Customer 
FROM WarehouseInventory AS wi 
FULL OUTER JOIN Withdrawals AS wd 
ON wi.[Date] = wd.[Date] AND wi.ProductId = wd.ProductId 
LEFT JOIN Customers AS c ON c.[Customer Id] = wd.CustomerId 
ORDER BY Date_Added 
+0

我只是upvoted你的答案,但它missinng分組和MAX評價(除了誤導性的標題和問題的缺失配方) – rfb

+0

@rfb我已經得到了每個'Date','ProductId'都有一行。如果是這種情況,則分組是不必要的。我相信OP試圖使用分組,因爲他正在使用'CROSS JOIN'生成的許多冗餘行。但讓我們知道OP真正想要什麼。 –

+0

我重申OP給出了一個糟糕的表達式,並且你在'CROSS JOIN'中定義了冗餘。但一般認爲並不是基於樣本數據,沒有任何說'WarehouseInventory'不能在不同行(相同的Date和ProductId以及不同的DelRec)中重複使用Date和ProductId。 也考慮到產出顯示庫存。 – rfb