您好,我一直在尝试编写查询,以逐月显示所有销售总额。数据也应按国家和类别分组。
每个国家/地区都必须提供所有类别的所有数据,即使该数据不存在。我知道我可能需要交叉连接和至少一个左连接,但是几个小时我一直不知道该怎么做。
下面我附上表格和所需的结果以帮助理解。
餐桌产品
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
答案 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 product
和category
表中的所有结果中创建country
。您的示例每个都有2个-2 * 2 = 4个结果。但是,如果每个中有5个,您将收到25个结果。