联接以返回所有行,即使没有结果

时间:2018-11-01 17:34:29

标签: sql sql-server

我想获取一份清单,列出每个公司所有类别我们销售的产品数量。

我希望结果看起来像这样

Category A  Company 1    0
Category A  Company 2    0 
Category A  Company 3    5
Category B  Company 1    1 
Category B  Company 2    4
Category B  Company 3    0

因此,即使没有销售,每个类别都会返回,每个公司也会返回。

这是我正在尝试的查询,它应该使数据库的结构清晰。我从多个方向对此进行了攻击,但是似乎无法将自己的头绪围绕着如何找到想要的东西。

SELECT com.Company_Name, c.Category_Name,  sum(p.Quantity) 
FROM Category c
LEFT JOIN Item i on c.Category_ID = i.Category_ID
LEFT JOIN Products p on p.Item_ID = i.Item_ID
LEFT JOIN Invoice iv on iv.Invoice_ID = p.Invoice_ID
LEFT JOIN Company com on com.Company_Id = iv.Company_ID
group by c.Category_Name, com.Company_Name

感谢您的帮助...

1 个答案:

答案 0 :(得分:1)

通过交叉联接生成行,然后在其余信息中生成left join

SELECT co.Company_Name, ca.Category_Name, 
       COALESCE(SUM(p.Quantity), 0) as quantity 
FROM Category c CROSS JOIN
     Company co LEFT JOIN
     (Invoice iv JOIN
      Products p
      ON iv.Invoice_ID = p.Invoice_ID JOIN
      Item i
      ON p.Item_ID = i.Item_ID
     ) 
     ON co.Company_Id = iv.Company_ID AND
        c.Category_ID = i.Category_ID
GROUP BY ca.Category_Name, co.Company_Name