使用第三个不相关的表连接两个表

时间:2015-10-19 02:11:33

标签: sql-server

我有两个相关的产品表和第三个不相关的期间表,我想用它来确保我得到一整套数据。

我不想存储每件产品的所有空白期间,只是存储销售的期间。

首先,我们有财务表,它是所有期间的“主要”:

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

该特定行。

我曾尝试过加入,但我无法看到如何让每个产品加入期间表中的信息。

2 个答案:

答案 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上执行SUMSales以获得所需的结果:

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