>>>CREATE TABLE #myOtherTable (cost money not null) >>> >>>select CAST(cost as money) as cost >>>into #newtable >>>from #myOtherTable >>> >>>INSERT into #newtable VALUES (NULL) >>> >>>SELECT * FROM #newtable >>> >>>DROP TABLE #myOtherTable >>>DROP TABLE #newtable >>>>>
IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'siriussp_CostOfGoodsSold_FIFO_2012' AND ROUTINE_TYPE = 'PROCEDURE' ) EXECUTE ('CREATE PROCEDURE dbo.siriussp_CostOfGoodsSold_FIFO_2012 AS SET NOCOUNT ON;'); GO ALTER PROCEDURE dbo.siriussp_CostOfGoodsSold_FIFO_2012 (@dtStart DATETIME) --============================================================= /* SP that returns total quantity and cost of goods sold by department, category, item, invent_id, and locatn_id, using FIFO (First IN, First OUT) method of cost valuation. Modified on 07/09/2012 --============================================================= */ AS BEGIN SET NOCOUNT ON; IF NOT EXISTS ( SELECT NAME FROM TempDB.sys.sysindexes WHERE NAME = 'idx_Inventory_fifo_rank' ) CREATE INDEX idx_Inventory_fifo_rank ON #Inventory ( InvNo ,fifo_rank ) INCLUDE ( ref_no ,date_time ,department ,category ,item ,invent_id ,locatn_id ,trans_type ,quantity ,unit_cost ); IF OBJECT_ID('TempDB..#CostTiers', N'U') IS NOT NULL DROP TABLE #CostTiers; SELECT date_time ,InvNo ,unit_cost ,department ,category ,item ,invent_id ,units_thru - quantity + 1 AS units_from ,units_thru INTO #CostTiers FROM ( SELECT ii3.date_time ,ii3.InvNo ,ii3.unit_cost ,ii3.quantity ,ii3.department ,ii3.category ,ii3.item ,ii3.invent_id ,SUM(ii3.quantity) OVER ( PARTITION BY ii3.InvNo ORDER BY ii3.fifo_rank ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS units_thru FROM #Inventory ii3 WHERE ii3.trans_type IN ( 'P' ,'A' ,'T' ) AND ii3.quantity > 0 ) X OPTION (RECOMPILE); IF OBJECT_ID('TempDB..#Sales', N'U') IS NOT NULL DROP TABLE #Sales; SELECT trans_no ,date_time ,InvNo ,department ,category ,item ,invent_id ,locatn_id ,Sold -- or Returned ,RemovedPrior INTO #Sales FROM ( SELECT I.ref_no AS trans_no ,I.date_time ,I.InvNo ,I.department ,I.category ,I.item ,I.invent_id ,I.locatn_id ,I.trans_type ,0 - I.quantity AS Sold -- or Returned ,( 0 - SUM(I.quantity) OVER ( PARTITION BY I.InvNo ORDER BY I.fifo_rank ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) ) + I.quantity AS RemovedPrior FROM #Inventory I WHERE I.Trans_Type = 'S' OR I.Quantity < 0 -- negative transfers ) I WHERE I.trans_type = 'S' AND I.date_time >= @dtStart OPTION (RECOMPILE); CREATE INDEX idx_CostTiers ON #CostTiers ( InvNo ,date_time ,units_from ,units_thru ) INCLUDE (unit_cost); CREATE INDEX idx_Sales ON #Sales ( InvNo ,date_time ,Sold ) INCLUDE ( trans_no ,department ,category ,item ,invent_id ,locatn_id ,RemovedPrior ); IF OBJECT_ID('TempDB..#SoldStack', N'U') IS NOT NULL DROP TABLE #SoldStack; SELECT S.trans_no ,S.department ,S.category ,S.item ,S.invent_id ,S.locatn_id ,S.date_time ,S.Sold AS QuantitySold ,CAST(COALESCE(CT.unit_cost,NULL) AS Money) AS unit_cost ,CAST(COALESCE(S.Sold * CT.unit_cost, NULL) AS Money) AS CostOfGoodsSold INTO #SoldStack FROM #Sales S INNER JOIN #CostTiers CT ON S.InvNo = CT.InvNO AND S.date_time >= CT.date_time AND (S.RemovedPrior <=0 OR S.RemovedPrior BETWEEN CT.units_from AND CT.units_thru) AND S.RemovedPrior + S.Sold BETWEEN CT.units_from AND CT.units_thru INSERT INTO #SoldStack (trans_no ,department ,category ,item ,invent_id ,locatn_id ,date_time ,QuantitySold ,unit_cost) SELECT SoldStack.trans_no ,SoldStack.department ,SoldStack.category ,SoldStack.item ,SoldStack.invent_id ,SoldStack.locatn_id ,SoldStack.date_time ,SoldStack.Sold AS QuantitySold ,CostTiers.unit_cost FROM ( SELECT S.trans_no ,S.InvNo ,S.department ,S.category ,S.item ,S.invent_id ,S.locatn_id ,S.Sold ,S.RemovedPrior ,S.date_time ,CASE WHEN S.RemovedPrior > 0 THEN S.RemovedPrior ELSE 0 END + SIGN(S.Sold) * N.number AS SoldStack FROM #Sales S INNER JOIN dbo.numbers N on N.number > 0 AND N.number <= ABS(S.Sold) WHERE NOT EXISTS (SELECT 1 FROM #SoldStack SS WHERE SS.trans_no = S.trans_no) ) SoldStack LEFT JOIN #CostTiers CostTiers ON SoldStack.InvNo = CostTiers.InvNo AND SoldStack.date_time >= CostTiers.date_time AND SoldStack.SoldStack BETWEEN CostTiers.units_from AND CostTiers.units_thru ; CREATE INDEX idsSoldStack_DCI ON #SoldStack ( department ,category ,item ,invent_id ,date_time ) WHERE unit_cost IS NULL; UPDATE #SoldStack SET unit_cost = LastMatrixCost.LastCost FROM #SoldStack SoldStack OUTER APPLY ( SELECT TOP (1) unit_cost AS LastCost FROM #CostTiers CT WHERE CT.department = SoldStack.department AND CT.category = SoldStack.category AND CT.item = SoldStack.item AND CT.invent_id = SoldStack.invent_id AND CT.date_time <= SoldStack.date_time ORDER BY date_time DESC ) LastMatrixCost WHERE SoldStack.unit_cost IS NULL; UPDATE #SoldStack SET unit_cost = LastCost.LastCost FROM #SoldStack SoldStack OUTER APPLY ( SELECT TOP (1) unit_cost AS LastCost FROM #CostTiers CT WHERE CT.department = SoldStack.department AND CT.category = SoldStack.category AND CT.item = SoldStack.item AND CT.date_time <= SoldStack.date_time ORDER BY date_time DESC ) LastCost WHERE SoldStack.unit_cost IS NULL UPDATE #SoldStack SET unit_cost = LastMatrixPO.LastCost FROM #SoldStack SoldStack OUTER APPLY ( SELECT TOP (1) unit_cost AS LastCost FROM dbo.i_pchord ii WHERE ii.department = SoldStack.department AND ii.category = SoldStack.category AND ii.item = SoldStack.item AND ii.invent_id = SoldStack.invent_id AND ii.date_time <= SoldStack.date_time ORDER BY ii.date_time DESC ) LastMatrixPO WHERE SoldStack.unit_cost IS NULL AND SoldStack.invent_id <> 0; UPDATE #SoldStack SET unit_cost = LastPO.LastCost FROM #SoldStack SoldStack OUTER APPLY ( SELECT TOP (1) unit_cost AS LastCost FROM dbo.i_pchord ii WHERE ii.department = SoldStack.department AND ii.category = SoldStack.category AND ii.item = SoldStack.item AND ii.date_time <= SoldStack.date_time ORDER BY ii.date_time DESC ) LastPO WHERE SoldStack.unit_cost IS NULL; UPDATE #SoldStack SET unit_cost = 0 FROM #SoldStack SoldStack WHERE unit_cost IS NULL; SELECT SoldStack.trans_no ,SoldStack.department ,SoldStack.category ,SoldStack.item ,SoldStack.invent_id ,SoldStack.locatn_id ,SoldStack.QuantitySold ,CASE WHEN SoldStack.CostOfGoodsSold IS NULL THEN CAST(SIGN(SoldStack.QuantitySold) * SUM(unit_cost) AS MONEY) ELSE SoldStack.CostOfGoodsSold END AS CostOfGoodsSold FROM #SoldStack SoldStack GROUP BY SoldStack.trans_no ,SoldStack.department ,SoldStack.category ,SoldStack.item ,SoldStack.invent_id ,SoldStack.locatn_id ,SoldStack.QuantitySold ,SoldStack.CostOfGoodsSold; RETURN; END GO /* Test Cases IF OBJECT_ID('TempDB..#Inventory',N'U') IS NOT NULL DROP TABLE #Inventory; CREATE TABLE [dbo].[#Inventory]( [InvNo] [int] NOT NULL, [ref_no] [numeric](17, 0) NOT NULL, [locatn_id] [int] NOT NULL, [date_time] [datetime] NOT NULL, [fifo_rank] [bigint] NULL, [department] [char](10) NOT NULL, [category] [char](10) NOT NULL, [item] [char](10) NOT NULL, [invent_id] [int] NOT NULL, [trans_type] [char](1) NOT NULL, [quantity] [numeric](8, 2) NOT NULL, [unit_cost] [money] NOT NULL ) ;with cte as (SELECT N'25' AS [ref_no], N'1' AS [locatn_id], N'2012-06-29 16:48:39.000' AS [date_time], N'1' AS [fifo_rank], N'1' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'BATT_TEST' AS [item], N'0' AS [invent_id], N'P' AS [trans_type], N'100.00' AS [quantity], N'1.00' AS [unit_cost] UNION ALL SELECT N'133005001' AS [ref_no], N'1' AS [locatn_id], N'2012-06-29 17:00:13.000' AS [date_time], N'2' AS [fifo_rank], N'1' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'BATT_TEST' AS [item], N'0' AS [invent_id], N'S' AS [trans_type], N'-90.00' AS [quantity], N'0.00' AS [unit_cost] UNION ALL SELECT N'25' AS [ref_no], N'1' AS [locatn_id], N'2012-06-29 17:26:47.000' AS [date_time], N'3' AS [fifo_rank], N'1' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'BATT_TEST' AS [item], N'0' AS [invent_id], N'P' AS [trans_type], N'100.00' AS [quantity], N'2.00' AS [unit_cost] UNION ALL SELECT N'135005001' AS [ref_no], N'1' AS [locatn_id], N'2012-06-29 17:28:19.000' AS [date_time], N'4' AS [fifo_rank], N'1' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'BATT_TEST' AS [item], N'0' AS [invent_id], N'S' AS [trans_type], N'10.00' AS [quantity], N'0.00' AS [unit_cost] UNION ALL SELECT N'0' AS [ref_no], N'1' AS [locatn_id], N'2012-06-27 11:58:26.000' AS [date_time], N'1' AS [fifo_rank], N'2' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'BUG_SPRAY' AS [item], N'0' AS [invent_id], N'T' AS [trans_type], N'10.00' AS [quantity], N'2.00' AS [unit_cost] UNION ALL SELECT N'129005001' AS [ref_no], N'1' AS [locatn_id], N'2012-06-27 13:02:57.000' AS [date_time], N'2' AS [fifo_rank], N'2' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'BUG_SPRAY' AS [item], N'0' AS [invent_id], N'S' AS [trans_type], N'-9.00' AS [quantity], N'0.00' AS [unit_cost] UNION ALL SELECT N'0' AS [ref_no], N'1' AS [locatn_id], N'2012-06-27 13:06:07.000' AS [date_time], N'3' AS [fifo_rank], N'2' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'BUG_SPRAY' AS [item], N'0' AS [invent_id], N'T' AS [trans_type], N'10.00' AS [quantity], N'2.6667' AS [unit_cost] UNION ALL SELECT N'130005001' AS [ref_no], N'1' AS [locatn_id], N'2012-06-27 13:17:46.000' AS [date_time], N'4' AS [fifo_rank], N'2' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'BUG_SPRAY' AS [item], N'0' AS [invent_id], N'S' AS [trans_type], N'-7.00' AS [quantity], N'0.00' AS [unit_cost] UNION ALL SELECT N'131005001' AS [ref_no], N'1' AS [locatn_id], N'2012-06-27 13:18:16.000' AS [date_time], N'5' AS [fifo_rank], N'2' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'BUG_SPRAY' AS [item], N'0' AS [invent_id], N'S' AS [trans_type], N'3.00' AS [quantity], N'0.00' AS [unit_cost] UNION ALL SELECT N'24' AS [ref_no], N'3' AS [locatn_id], N'2012-06-27 11:57:17.000' AS [date_time], N'1' AS [fifo_rank], N'3' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'BUG_SPRAY' AS [item], N'0' AS [invent_id], N'P' AS [trans_type], N'20.00' AS [quantity], N'2.00' AS [unit_cost] UNION ALL SELECT N'0' AS [ref_no], N'3' AS [locatn_id], N'2012-06-27 11:58:26.000' AS [date_time], N'2' AS [fifo_rank], N'3' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'BUG_SPRAY' AS [item], N'0' AS [invent_id], N'T' AS [trans_type], N'-10.00' AS [quantity], N'2.00' AS [unit_cost] UNION ALL SELECT N'24' AS [ref_no], N'3' AS [locatn_id], N'2012-06-27 13:04:29.000' AS [date_time], N'3' AS [fifo_rank], N'3' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'BUG_SPRAY' AS [item], N'0' AS [invent_id], N'P' AS [trans_type], N'20.00' AS [quantity], N'3.00' AS [unit_cost] UNION ALL SELECT N'0' AS [ref_no], N'3' AS [locatn_id], N'2012-06-27 13:06:07.000' AS [date_time], N'4' AS [fifo_rank], N'3' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'BUG_SPRAY' AS [item], N'0' AS [invent_id], N'T' AS [trans_type], N'-10.00' AS [quantity], N'2.6667' AS [unit_cost] UNION ALL SELECT N'4' AS [ref_no], N'1' AS [locatn_id], N'2011-04-03 18:34:44.000' AS [date_time], N'1' AS [fifo_rank], N'4' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'T' AS [trans_type], N'24.00' AS [quantity], N'0.75' AS [unit_cost] UNION ALL SELECT N'11005001' AS [ref_no], N'1' AS [locatn_id], N'2011-04-07 09:57:51.000' AS [date_time], N'2' AS [fifo_rank], N'4' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'S' AS [trans_type], N'-1.00' AS [quantity], N'0.00' AS [unit_cost] UNION ALL SELECT N'33005001' AS [ref_no], N'1' AS [locatn_id], N'2011-04-07 10:04:39.000' AS [date_time], N'3' AS [fifo_rank], N'4' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'S' AS [trans_type], N'-1.00' AS [quantity], N'0.00' AS [unit_cost] UNION ALL SELECT N'103005001' AS [ref_no], N'1' AS [locatn_id], N'2011-07-06 17:55:17.000' AS [date_time], N'4' AS [fifo_rank], N'4' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'S' AS [trans_type], N'-1.00' AS [quantity], N'0.00' AS [unit_cost] UNION ALL SELECT N'108005001' AS [ref_no], N'1' AS [locatn_id], N'2011-07-06 17:55:47.000' AS [date_time], N'5' AS [fifo_rank], N'4' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'S' AS [trans_type], N'-1.00' AS [quantity], N'0.00' AS [unit_cost] UNION ALL SELECT N'115005001' AS [ref_no], N'1' AS [locatn_id], N'2011-08-01 17:47:11.000' AS [date_time], N'6' AS [fifo_rank], N'4' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'S' AS [trans_type], N'-1.00' AS [quantity], N'0.00' AS [unit_cost] UNION ALL SELECT N'41005001' AS [ref_no], N'1' AS [locatn_id], N'2011-09-04 11:24:03.000' AS [date_time], N'7' AS [fifo_rank], N'4' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'S' AS [trans_type], N'-2.00' AS [quantity], N'0.00' AS [unit_cost] UNION ALL SELECT N'48005001' AS [ref_no], N'1' AS [locatn_id], N'2011-09-04 11:38:31.000' AS [date_time], N'8' AS [fifo_rank], N'4' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'S' AS [trans_type], N'-3.00' AS [quantity], N'0.00' AS [unit_cost] UNION ALL SELECT N'65005001' AS [ref_no], N'1' AS [locatn_id], N'2011-09-04 11:59:59.000' AS [date_time], N'9' AS [fifo_rank], N'4' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'S' AS [trans_type], N'-1.00' AS [quantity], N'0.00' AS [unit_cost] UNION ALL SELECT N'1' AS [ref_no], N'1' AS [locatn_id], N'2012-06-26 17:02:19.000' AS [date_time], N'10' AS [fifo_rank], N'4' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'A' AS [trans_type], N'5.00' AS [quantity], N'0.75' AS [unit_cost] UNION ALL SELECT N'0' AS [ref_no], N'1' AS [locatn_id], N'2012-06-26 17:09:46.000' AS [date_time], N'11' AS [fifo_rank], N'4' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'A' AS [trans_type], N'5.00' AS [quantity], N'0.10' AS [unit_cost] UNION ALL SELECT N'0' AS [ref_no], N'1' AS [locatn_id], N'2012-06-26 17:15:05.000' AS [date_time], N'12' AS [fifo_rank], N'4' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'T' AS [trans_type], N'5.00' AS [quantity], N'0.5469' AS [unit_cost] UNION ALL SELECT N'0' AS [ref_no], N'1' AS [locatn_id], N'2012-06-26 17:15:47.000' AS [date_time], N'13' AS [fifo_rank], N'4' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'T' AS [trans_type], N'5.00' AS [quantity], N'0.5469' AS [unit_cost] UNION ALL SELECT N'125005001' AS [ref_no], N'1' AS [locatn_id], N'2012-06-26 18:00:26.000' AS [date_time], N'14' AS [fifo_rank], N'4' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'S' AS [trans_type], N'-10.00' AS [quantity], N'0.00' AS [unit_cost] UNION ALL SELECT N'126005001' AS [ref_no], N'1' AS [locatn_id], N'2012-06-26 18:01:05.000' AS [date_time], N'15' AS [fifo_rank], N'4' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'S' AS [trans_type], N'5.00' AS [quantity], N'0.00' AS [unit_cost] UNION ALL SELECT N'127005001' AS [ref_no], N'1' AS [locatn_id], N'2012-06-26 18:02:07.000' AS [date_time], N'16' AS [fifo_rank], N'4' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'S' AS [trans_type], N'-50.00' AS [quantity], N'0.00' AS [unit_cost] UNION ALL SELECT N'128005001' AS [ref_no], N'1' AS [locatn_id], N'2012-06-26 18:02:51.000' AS [date_time], N'17' AS [fifo_rank], N'4' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'S' AS [trans_type], N'30.00' AS [quantity], N'0.00' AS [unit_cost] UNION ALL SELECT N'5' AS [ref_no], N'3' AS [locatn_id], N'2011-04-03 16:41:21.000' AS [date_time], N'1' AS [fifo_rank], N'5' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'P' AS [trans_type], N'60.00' AS [quantity], N'0.75' AS [unit_cost] UNION ALL SELECT N'1' AS [ref_no], N'3' AS [locatn_id], N'2011-04-03 17:46:45.000' AS [date_time], N'2' AS [fifo_rank], N'5' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'A' AS [trans_type], N'-2.00' AS [quantity], N'0.75' AS [unit_cost] UNION ALL SELECT N'4' AS [ref_no], N'3' AS [locatn_id], N'2011-04-03 18:34:44.000' AS [date_time], N'3' AS [fifo_rank], N'5' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'T' AS [trans_type], N'-24.00' AS [quantity], N'0.75' AS [unit_cost] UNION ALL SELECT N'23' AS [ref_no], N'3' AS [locatn_id], N'2012-06-26 17:00:58.000' AS [date_time], N'4' AS [fifo_rank], N'5' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'P' AS [trans_type], N'10.00' AS [quantity], N'0.75' AS [unit_cost] UNION ALL SELECT N'23' AS [ref_no], N'3' AS [locatn_id], N'2012-06-26 17:04:59.000' AS [date_time], N'5' AS [fifo_rank], N'5' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'P' AS [trans_type], N'20.00' AS [quantity], N'0.10' AS [unit_cost] UNION ALL SELECT N'0' AS [ref_no], N'3' AS [locatn_id], N'2012-06-26 17:15:05.000' AS [date_time], N'6' AS [fifo_rank], N'5' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'T' AS [trans_type], N'-5.00' AS [quantity], N'0.5469' AS [unit_cost] UNION ALL SELECT N'0' AS [ref_no], N'3' AS [locatn_id], N'2012-06-26 17:15:47.000' AS [date_time], N'7' AS [fifo_rank], N'5' AS [InvNo], N'RETAIL' AS [department], N'SUPPLIES' AS [category], N'GRANOLABAR' AS [item], N'0' AS [invent_id], N'T' AS [trans_type], N'-5.00' AS [quantity], N'0.5469' AS [unit_cost] ) insert #Inventory ([ref_no], [locatn_id], [date_time], [fifo_rank], [InvNo], [department], [category], [item], [invent_id], [trans_type], [quantity], [unit_cost]) SELECT [ref_no], [locatn_id], [date_time], [fifo_rank], [InvNo], [department], [category], [item], [invent_id], [trans_type], [quantity], [unit_cost] from cte --CREATE INDEX idx_Inventory_fifo_rank ON #Inventory (InvNo, fifo_rank) SELECT * FROM #Inventory WHERE Item = 'Granolabar' ORDER BY InvNo, fifo_rank set statistics io on DECLARE @Time datetime2(7) = SYSDATETIME(), @Elapsed int, @dtStart datetime set @dtStart = '20120629' EXECUTE dbo.siriussp_CostOfGoodsSold_FIFO '20010629' set @Elapsed = DATEDIFF(millisecond,@time, SYSDATETIME()) print 'Elapsed for SQL 2005: ' + convert(varchar(10),@Elapsed) + ' milliseconds' SET @Time = SYSDATETIME() EXECUTE dbo.siriussp_CostOfGoodsSold_FIFO_2012 '20010629' set @Elapsed = DATEDIFF(millisecond,@time, SYSDATETIME()) print 'Elapsed for SQL 2012: ' + convert(varchar(10),@Elapsed) + ' milliseconds' set statistics io off go */