Sql server 用第三个不相关的表连接两个表
我有两个相关的product表和第三个无关的period表,我想用它们来确保返回的数据是完整的 我不想存储每个产品的所有空时段,只想存储获得销售的时段 首先,我们有财务表,它是所有时期的“主数据”:Sql server 用第三个不相关的表连接两个表,sql-server,Sql Server,我有两个相关的product表和第三个无关的period表,我想用它们来确保返回的数据是完整的 我不想存储每个产品的所有空时段,只想存储获得销售的时段 首先,我们有财务表,它是所有时期的“主数据”: ID | PERIOD ------------ 1 | Jan 2 | Feb 3 | Mar 然后是产品和销售表 ID | Code ------------ 1 | ABC 2 | XYZ Product_ID | Period_ID | Sales --------------
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
其次,如果某个期间的销售表中有超过1个条目,那么是否可以对总数进行合计?即:
Product_ID | Period_ID | Sales
------------------------------
1 | 1 | 1
1 | 1 | 1
会回来吗
Product_ID | Period_ID | Sales
------------------------------
1 | 1 | 4
那一行
我已尝试进行联接,但看不到如何使其联接每个产品的周期表中的信息。使用左联接。差不多
SELECT a.*, b.* FROM master AS a LEFT JOIN sales AS b ON (a.Period_ID = b.Period_ID)
您需要首先交叉连接财务表和产品表,以获得期间和产品的所有可能组合。然后对Sales进行左连接和求和,以获得所需的结果:
很抱歉,这只加入product and sales表并忽略缺少的句点。谢谢,这对MS SQL有效。Firebird 1.5没有交叉连接命令,有没有更不可知的方法?此外,这方面最好的指数优化方法是什么,它第一次运行得相当慢。而不是交叉连接尝试:从财务f,产品p,或从财务f内部连接产品p在1=1。第二种方法运行得很好,它实际上运行得更快,但执行计划复杂得多。
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