2015-10-19 83 views
0

我有兩個相關產品表格和第三個不相關的時期表格,我想用它們來確保我得到一整套返回的數據。將兩個表格與第三個無關表格結合

我不想存儲每個產品的所有空閒時段,只是出售時段。

首先,我們的財務表,這是所有時期的「主人」:

ID | PERIOD 
------------ 
1 | Jan 
2 | Feb 
3 | Mar 

然後將產品和銷售表

ID | Code 
------------ 
1 | ABC 
2 | XYZ 

Product_ID | Period_ID | Sales 
------------------------------ 
    1  |  1  | 5 
    2  |  1  | 4 
    2  |  3  | 7 

我想制定一個查詢以便我可以返回每個期間的結果,而不管它們是否有銷售額:

Product_ID | Product_Code | Period_ID | Period_Name | Sales 
----------------------------------------------------------- 
    1  |  ABC  |  1  | Jan  | 5 
    1  |  ABC  |  2  | Feb  | 0 
    1  |  ABC  |  3  | Mar  | 0 
    2  |  XYZ  |  1  | Jan  | 4 
    2  |  XYZ  |  2  | Feb  | 0 
    2  |  XYZ  |  3  | Mar  | 7 

我需要查詢儘可能通用,它需要針對Firebird(1.5)和MS SQL。如果這是不可能的,那麼MS SQL是首選。

次要的是,如果銷售表中有一段時間以上的條目,總數是否可以合計?即:

Product_ID | Period_ID | Sales 
------------------------------ 
    1  |  1  | 1 
    1  |  1  | 1 

能夠爲這一特定的線路返回

Product_ID | Period_ID | Sales 
------------------------------ 
    1  |  1  | 4 

我試圖做一個連接,但我看不到如何讓它加入每個產品的週期表中的信息。

回答

0

東西,你需要CROSS JOINFinancial表和Product表率先拿到週期和產品的所有可能的組合。然後做一個LEFT JOINSUMSales以得到期望的結果:

SQL Fiddle

SELECT 
    p.ID AS Product_ID, 
    p.Code AS Product_Code, 
    f.ID AS Period_ID, 
    f.Period AS Period_ID, 
    SUM(COALESCE(s.Sales, 0)) AS Sales 
FROM Financials f 
CROSS JOIN Product p 
LEFT JOIN Sales s 
    ON s.Period_ID = f.ID 
    AND s.Product_ID = p.ID 
GROUP BY 
    p.ID, p.Code, f.ID, f.Period 
ORDER BY 
    p.ID, f.ID 
+0

謝謝,這對MS SQL有效。火鳥1.5沒有CROSS JOIN命令,有沒有更不可知的方式來做到這一點?另外什麼是最好的索引優化,它首次運行速度很慢。 – Darren

+1

而不是'CROSS JOIN'嘗試:'從財務f,產品p'。 –

+1

或'從財務內部加入產品p ON 1 = 1' –

0

使用左連接。像

SELECT a.*, b.* FROM master AS a LEFT JOIN sales AS b ON (a.Period_ID = b.Period_ID) 
+0

對不起,這只是加入了產品和銷售表,並忽略失蹤週期。 – Darren

相關問題