Running Counter in SQL 2008
I'm trying to establish a temp table for a running inventory demand report in SQL 2008. I can get the results that I am looking for until I hit an invoice with multiple lines. Here is the code so far:
--Gather Current Order Data
DECLARE @b TABLE ([Planned Shipment Date] DATE, [Order] VARCHAR(15), [Line Number] VARCHAR(15), [Location] VARCHAR(15), [Item] VARCHAR(15), [QuantityUsed] INT)
INSERT INTO @b
SELECT [Planned Shipment Date], [Document No_], [Line No_], [Location Code], No_, CAST(SUM([Outstanding Quantity]) AS INT)
FROM [STAGE].[dbo].[TRU$Sales Line]
WHERE [Document No_] LIKE 'SO%'
AND [Gen_ Prod_ Posting Group] IN ('TOY', 'AUDIO', 'BICYCLE')
AND [Outstanding Quantity] <> 0
GROUP BY [Document No_], [Location Code], [Line No_], [Planned Shipment Date], No_
ORDER BY [Planned Shipment Date], [Document No_], [Line No_], [Location Code], No_
--Gather Current Inventory Data
DECLARE @a TABLE ([Item] VARCHAR(15), [Location] VARCHAR(15), [Inventory] INT)
INSERT INTO @a
SELECT [Item No_], [Location Code], CAST(SUM([Quantity]) AS INT)
FROM [STAGE].[dbo].[TRU$Item Ledger Entry]
GROUP BY [Item No_], [Location Code]
ORDER BY [Item No_], [Location Code]
DROP TABLE ##TEMP
--Insert to a temp table for testing
SELECT [Planned Shipment Date], [Location], [Item], [Order], [Line Number],
[Outstanding Qty], [Total Inventory], [Running Order Total]
INTO ##TEMP
FROM
(SELECT
[order].[Planned Shipment Date]
,[order].[Location]
,[order].[Item]
,[order].[Order]
,[order].[Line Number]
,0 AS [Outstanding Qty]
,(SELECT SUM(inventory)
FROM @a inv
WHERE inv.item = [order].[Item]
AND inv.location = [order].[Location]) AS [Total Inventory]
,(SELECT SUM(QuantityUsed)
FROM @b prevorder
WHERE prevorder.item = [order].[Item]
AND prevorder.location = [order].[Location]
AND prevorder.[order] <= [order].[Order]
) AS [Running Order Total]
FROM @b [order]
) AS OrderExtended
--WHERE [Total Inventory] < [Running Order Total]
ORDER BY [Planned Shipment Date], [Order], [Line Number], [Location], [Item] ASC
GO
--Display outstanding quantity to ship on the temp table
UPDATE ##TEMP
SET [Outstanding Qty] = SL.[Outstanding Quantity]
FROM ##TEMP T, [TRU$Sales Line] SL
WHERE T.[Order] = SL.[Document No_]
AND T.[Line Number] = SL.[Line No_]
GO
When I run a query such as:
SELECT * FROM ##TEMP
WHERE Item = '1011861'
ORDER BY [Order], [Line Number]
I get something like (incorrect running total of outstanding qty):
Planned Shipment Date | Location | Item | Order | Line Number | Outstanding Qty | Total Inventory | Running Order Total
2010-08-20 开发者_Go百科 HQ 1011861 SO18727 6 3 49 103
2010-09-10 HQ 1011861 SO18727 7 50 49 103
2010-10-01 HQ 1011861 SO18727 8 34 49 103
2010-08-20 HQ 1011861 SO18731 6 45 49 174
2010-09-10 HQ 1011861 SO18731 7 26 49 174
2010-08-20 HQ 1011861 SO19268 1 1 49 175
2010-08-26 HQ 1011861 SO20476 8 1 49 176
2010-08-26 HQ 1011861 SO20552 4 1 49 177
2010-08-27 HQ 1011861 SO20630 8 2 49 179
What I am expecting is something like (a true running total of outstanding qty):
Planned Shipment Date | Location | Item | Order | Line Number | Outstanding Qty | Total Inventory | Running Order Total
2010-08-20 HQ 1011861 SO18727 6 3 49 3
2010-09-10 HQ 1011861 SO18727 7 50 49 53
2010-10-01 HQ 1011861 SO18727 8 34 49 87
2010-08-20 HQ 1011861 SO18731 6 45 49 132
2010-09-10 HQ 1011861 SO18731 7 26 49 158
2010-08-20 HQ 1011861 SO19268 1 1 49 159
2010-08-26 HQ 1011861 SO20476 8 1 49 160
2010-08-26 HQ 1011861 SO20552 4 1 49 161
2010-08-27 HQ 1011861 SO20630 8 2 49 163
It seems that when a different shipment date is included on an order (more than one line per order) it throws my query off. What am I missing? I have looked at this so much that I'm afraid that I can't see the obvious solution.
Thanks for any help, Doug
You have to limit [Line Number] when prevorder.Order=[order].Order:
(SELECT SUM(QuantityUsed) FROM @b prevorder
WHERE prevorder.item = [order].[Item] AND prevorder.location = [order].Location]
AND (prevorder.[order] < [order].[Order] OR (prevorder.[order] = [order].[Order]
AND prevorder.[Line Number] <= [order].[Line Number]))
AS [Running Order Total]
It would be more useful to order the report by [Planned Shipment Date], Order, [Line Number].
(SELECT SUM(QuantityUsed) FROM @b prevorder
WHERE prevorder.item = [order].[Item] AND prevorder.location = [order].Location]
AND (prevorder.[Planned Shipment Date] < [order].[Planned Shipment Date] OR
(prevorder.[Planned Shipment Date] = [order].[Planned Shipment Date]
AND (prevorder.[order] < [order].[Order] OR (prevorder.[order] = [order].[Order]
AND prevorder.[Line Number] <= [order].[Line Number])))
AS [Running Order Total]
Getting too Complex? Use a table with an Identity Column = RecordID intead of the #temp table. Insert the records in the order they should appear in the report.
(SELECT SUM(QuantityUsed) FROM @b prevorder
WHERE prevorder.Item = [order].[Item] AND prevorder.location = [order].Location]
AND prevorder.RecordID <= [order].RecordID) AS [Running Order Total]
精彩评论