Reputation: 45
I created the first part of the query which shows the total quantity of a product currently waiting to be sent out to customers & returns me the item number from the 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]
That works great, I get the catalogue number of the item and how many are on order. Now I need to join to another table, which shows me stock of items. This is what the query looks like -
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]
Now the quantity on order is way out and the quantity in stock is wrong as well. As I have the 'where' applied to the sales table but it doesn't apply to the stock table, do I need to move it out?
Thanks
Upvotes: 1
Views: 58
Reputation: 1071
In this case Common Table Expression is useful:
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]
Upvotes: 0
Reputation: 96552
I don't know if it will fix your problem but the where clause is turning your left join into an inner join. Try this instead.
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
Try this and see if it fixes the issue:
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
Upvotes: 1