我有两个相关的产品表和第三个不相关的期间表,我想用它来确保我得到一整套数据。
我不想存储每件产品的所有空白期间,只是存储销售的期间。
首先,我们有财务表,它是所有期间的“主要”:
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
该特定行。
我曾尝试过加入,但我无法看到如何让每个产品加入期间表中的信息。
答案 0 :(得分:0)
使用左连接。像
这样的东西SELECT a.*, b.* FROM master AS a LEFT JOIN sales AS b ON (a.Period_ID = b.Period_ID)
答案 1 :(得分:0)
您需要先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