使用sum与嵌套选择

时间:2011-12-04 20:45:08

标签: sql sql-server sql-server-2005

我正在使用SQL Server。此声明列出了每个菜单的产品:

SELECT menuname, productname
FROM [web].[dbo].[tblMenus]
FULL OUTER JOIN [web].[dbo].[tblProductsRelMenus]
  ON [tblMenus].Id = [tblProductsRelMenus].MenuId
FULL OUTER JOIN [web].[dbo].[tblProducts] 
  ON [tblProductsRelMenus].ProductId = [tblProducts].ProductId
LEFT JOIN [web].[dbo].[tblOrderDetails] 
   ON ([tblProducts].Id = [tblOrderDetails].ProductId)
GROUP BY [tblProducts].ProductName

有些产品没有菜单,反之亦然。我使用以下内容确定每种产品的销售情况。

SELECT [tblProducts].ProductName, SUM([tblOrderDetails].Ammount) as amount
FROM [web].[dbo].[tblProducts] 
LEFT JOIN [web].[dbo].[tblOrderDetails] 
   ON ([tblProducts].ProductId = [tblOrderDetails].ProductId)
GROUP BY [tblProducts].ProductName

我想要做的是用金额列补充顶部表格。也就是说,我想要一个具有与上面第一个表相同行数的表,但如果存在则需要一个金额值,否则为null。

我无法弄清楚如何做到这一点。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

如果我没有遗漏任何内容,可以简化第二个查询,然后将其合并到第一个查询中:

SELECT
  m.menuname,
  p.productname,
  t.amount
FROM [web].[dbo].[tblMenus] m
  FULL JOIN [web].[dbo].[tblProductsRelMenus] pm ON m.Id = pm.MenuId
  FULL JOIN [web].[dbo].[tblProducts] p ON pm.ProductId = p.ProductId
  LEFT JOIN (
    SELECT ProductId, SUM(Amount) as amount
    FROM [web].[dbo].[tblOrderDetails]
    GROUP BY ProductId
  ) t ON p.ProducId = t.ProductId