我需要 SQL 视图的子查询吗?

Do I Need a Subquery on SQL View?

我创建了查询的第一部分,它显示了当前等待发送给客户的产品的总数量 & returns 我从 Item table -

SELECT
  [Item].[ItemNum],
  SUM([Sales].[Quantity]) AS [Qty]
FROM [dbo].[Item]
LEFT OUTER JOIN [dbo].[Sales]
  ON [Item].[ItemNum] = [Sales].[ItemNum]
WHERE ([Sales].[Sale Type] = 1)
GROUP BY [Item].[ItemNum]

太棒了,我得到了商品的目录号以及订购的数量。现在我需要加入另一个 table,它会显示物品库存。这就是查询的样子 -

SELECT
  [Item].[ItemNum] SUM ([Sales].[Quantity]) AS [Qty], SUM ([Stock].[Remaining Quantity])
AS [Free Stock]
FROM [dbo].[Item]
LEFT OUTER JOIN dbo.[Sales]
  ON [Item].[ItemNu]m = [Sales].[ItemNum]
LEFT OUTER JOIN [dbo].[Stock]
  ON [Item].[ItemNum] = [Stock].[ItemNum]
WHERE ([Sales].[Document Type] = 1)
GROUP BY [Item].[ItemNum]

现在订货数量出问题了,库存数量也不对。由于我已将 'where' 应用于销售 table 但不适用于库存 table,我是否需要将其移出?

谢谢

我不知道它是否能解决您的问题,但 where 子句正在将您的左联接变成内联接。试试这个。

SELECT
  dbo.[databasename$Item].ItemNum, SUM (dbo.[databasename$Sales].Quantity) AS [Qty], SUM (dbo.[databasename$Stock.[Remaining Quantity])
AS [Free Stock]
FROM dbo.[databasename$Item]
LEFT OUTER JOIN dbo.[databasename$Sales]
  ON dbo.[databasename$Item].ItemNum = dbo.[databasename$Sales].ItemNum
  AND (dbo.[databasename$Sales].[Document Type] = 1)
LEFT OUTER JOIN dbo.[databasename$Stock]
  ON dbo.[databasename$Item].ItemNum = dbo.[databasename$Stock].[ItemNum]
GROUP BY dbo.[databasename$Item].ItemNum

试试看能否解决问题:

SELECT
  dbo.[databasename$Item].ItemNum, [databasename$Sales].Quantity) AS [Qty], [databasename$Stock.[Remaining Quantity])
AS [Free Stock]
FROM dbo.[databasename$Item]
LEFT OUTER JOIN (select ItemNum, sum(quantity) as Quantity from dbo.[databasename$Sales] where Document Type = 1group by ItemNum) as databasename$Sales
  ON dbo.[databasename$Item].ItemNum = [databasename$Sales].ItemNum
LEFT OUTER JOIN (select ItemNum, sum(quantity)  as RemainingQuantity from dbo.[databasename$Stock]roup by ItemNum)
as databasename$Stock
  ON dbo.[databasename$Item].ItemNum = [databasename$Stock].[ItemNum]
GROUP BY dbo.[databasename$Item].ItemNum

在这种情况下Common Table Expression是有用的:

With CTE As (
SELECT
  [Item].[ItemNum],
  SUM([Sales].[Quantity]) AS [Qty]
FROM [dbo].[Item]
LEFT OUTER JOIN [dbo].[Sales]
  ON [Item].[ItemNum] = [Sales].[ItemNum]
WHERE ([Sales].[Sale Type] = 1)
GROUP BY [Item].[ItemNum]
 )
  Select *
    From CTE Left Outer Join
     [dbo].[Stock]
  ON [CTE].[ItemNum] = [Stock].[ItemNum]