交叉连接的典型合法用途是显示例如按产品和地区划分的总销售额的报告.如果没有在区域R中销售产品P,那么我们希望看到一行为零,而不是仅显示一行.
select r.region_name, p.product_name, sum(s.sales_amount) from regions r cross join products p left outer join sales s on s.region_id = r.region_id and s.product_id = p.product_id group by r.region_name, p.product_name order by r.region_name, p.product_name;
我经常遇到的一个用途是将记录分成几个记录,主要用于报告目的.
想象一个字符串,其中每个字符代表相应小时内的某个事件.
ID | Hourly Event Data 1 | -----X-------X-------X-- 2 | ---X-----X------X------- 3 | -----X---X--X----------- 4 | ----------------X--X-X-- 5 | ---X--------X-------X--- 6 | -------X-------X-----X--
现在,您需要一份报告,显示当天发生的事件数量.用一张ID为1到24的表格交叉加入表格,然后运用你的魔法......
SELECT [hour].id, SUM(CASE WHEN SUBSTRING([data].string, [hour].id, 1) = 'X' THEN 1 ELSE 0 END) FROM [data] CROSS JOIN [hours] GROUP BY [hours].id
=>
1, 0 2, 0 3, 0 4, 2 5, 0 6, 2 7, 0 8, 1 9, 0 10, 2 11, 0 12, 0 13, 2 14, 1 15, 0 16, 1 17, 2 18, 0 19, 0 20, 1 21, 1 22, 3 23, 0 24, 0