需要帮助的手与SQL查询

时间:2018-08-09 19:01:32

标签: sql sql-server sql-server-2012

您好,我一直在尝试编写查询,以逐月显示所有销售总额。数据也应按国家和类别分组。

每个国家/地区都必须提供所有类别的所有数据,即使该数据不存在。我知道我可能需要交叉连接和至少一个左连接,但是几个小时我一直不知道该怎么做。

下面我附上表格和所需的结果以帮助理解。

餐桌产品

ProductId | Name   | CountryId | CategoryId
------------------------------------------
    4     |  Ax    |     4     |     3
    5     |  Ball  |     5     |     4

表格类别

CategoryId | Name
-----------------
    3      | Detail
    4      | Hurt

表格国家/地区

CountryId | CountryName
-----------------------
    4     | Germany
    5     | Sweden

表销售年份

SaleYearId | Year | ProductId
-----------------------------
      1    | 2018 |    4
      2    | 2018 |    5

餐桌销售

SaleId | SaleYearId | Month1 | Month2 | Month3 | Month4
   1   |     1      |   100  | NULL   | NULL   | NULL
   2   |     2      |   NULL | 500    | NULL   | NULL

所需的结果应类似于:

CountryId | CategoryId | Year | Month1 | Month2 | Month3 | Month4
    4     |      3     | 2018 | 100    | NULL   | NULL   | NULL
    4     |      4     | NULL | NULL   | NULL   | NULL   | NULL
    5     |      3     | NULL | NULL   | NULL   | NULL   | NULL
    5     |      4     | 2018 | NULL   | 500    | NULL   | NULL

DDL和样本数据:http://rextester.com/HHN19990

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,则可以将cross join与多个outer joins一起使用:

select c.countryid, 
    cat.categoryid,
    sy.year,
    s.month1, 
    s.month2, 
    s.month3, 
    s.month4
from country c cross join category cat
    left join product p on c.countryid = p.countryid and cat.categoryid = p.categoryid
    left join saleyear sy on p.productid = sy.productid
    left join sale s on sy.saleyearid = s.saleyearid

这将在cartesian productcategory表中的所有结果中创建country。您的示例每个都有2个-2 * 2 = 4个结果。但是,如果每个中有5个,您将收到25个结果。