2015-10-19 81 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

相关问题