将两个表格与第三个无关表格结合
问题描述:
我有两个相关产品表格和第三个不相关的时期表格,我想用它们来确保我得到一整套返回的数据。将两个表格与第三个无关表格结合
我不想存储每个产品的所有空闲时段,只是出售时段。
首先,我们的财务表,这是所有时期的“主人”:
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
。
我试图做一个连接,但我看不到如何让它加入每个产品的周期表中的信息。
答
东西,你需要CROSS JOIN
Financial
表和Product
表率先拿到周期和产品的所有可能的组合。然后做一个LEFT JOIN
和SUM
上Sales
以得到期望的结果:
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
答
使用左连接。像
SELECT a.*, b.* FROM master AS a LEFT JOIN sales AS b ON (a.Period_ID = b.Period_ID)
+0
对不起,这只是加入了产品和销售表,并忽略失踪周期。 – Darren
谢谢,这对MS SQL有效。火鸟1.5没有CROSS JOIN命令,有没有更不可知的方式来做到这一点?另外什么是最好的索引优化,它首次运行速度很慢。 – Darren
而不是'CROSS JOIN'尝试:'从财务f,产品p'。 –
或'从财务内部加入产品p ON 1 = 1' –