













SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO -- ============================================= -- Author: <Author,,AA> -- Create date: <Create Date,,2023-07-19> -- Description: <Description,,计算品号的使用情况(最近五年):连续X年在用> -- ============================================= ALTER PROCEDURE SP_GET_Item_UsedInfo (@pITEMCODE VARCHAR(50)) AS BEGIN SET NOCOUNT ON; --临时表 IF EXISTS ( SELECT * FROM tempdb.dbo.sysobjects WHERE id = OBJECT_ID(N'tempdb.dbo.#ItemUsedInfo') ) DROP TABLE #ItemUsedInfo CREATE TABLE #ItemUsedInfo ( ItemCode VARCHAR(50), UsedInfo NVARCHAR(100), --最后更新为:连续X在用 UsedYears INT, --记录连续使用的年数 FirstUsedYear INT, --连续使用开始年份 LastUsedYear INT --最后使用年份 ) --临时表 IF EXISTS ( SELECT * FROM tempdb.dbo.sysobjects WHERE id = OBJECT_ID(N'tempdb.dbo.#ItemTrans') ) DROP TABLE #ItemTrans CREATE TABLE #ItemTrans ( ItemCode VARCHAR(50), yyyy INT, qty DECIMAL(16, 8) ) --临时表 IF EXISTS ( SELECT * FROM tempdb.dbo.sysobjects WHERE id = OBJECT_ID(N'tempdb.dbo.#ItemTrans2') ) DROP TABLE #ItemTrans2 CREATE TABLE #ItemTrans2 ( ItemCode VARCHAR(50), yyyy INT, qty DECIMAL(16, 8) ) INSERT INTO #ItemTrans ( ItemCode, yyyy, qty ) SELECT i.ITEM_CODE, YEAR(tl.TRANSACTION_DATE) yyyy, SUM(tl.INVENTORY_QTY) chuku_qty FROM dbo.TRANSACTION_LINE AS tl INNER JOIN dbo.ITEM AS i ON i.ITEM_BUSINESS_ID = tl.ITEM_ID WHERE tl.Owner_Org_ROid = 'C8BAE02C-0A60-4FD0-46A9-12140D245E5D' AND ( tl.SOURCE_ID_RTK = 'SALES_ISSUE.SALES_ISSUE_D' OR ( tl.SOURCE_ID_RTK = 'ISSUE_RECEIPT.ISSUE_RECEIPT_D' AND tl.INVENTORY_QTY > 0 ) OR ( tl.SOURCE_ID_RTK = 'TRANSACTION_DOC.TRANSACTION_DOC_D' AND SUBSTRING(tl.DOC_NO, 1, 4) IN ( '1109', '1113' ) ) ) AND tl.STOCK_ACTION = -1 AND tl.CATEGORY <> '1G' AND YEAR(tl.TRANSACTION_DATE) >= YEAR(GETDATE()) - 5 AND ( i.ITEM_CODE LIKE (@pITEMCODE + '%') OR ISNULL(@pITEMCODE, '') = '' ) AND i.ITEM_CODE NOT LIKE '%-S' GROUP BY YEAR(tl.TRANSACTION_DATE), i.ITEM_CODE HAVING SUM(tl.INVENTORY_QTY) > 0 ORDER BY i.ITEM_CODE, yyyy DESC INSERT INTO #ItemUsedInfo ( ItemCode, UsedInfo, UsedYears, FirstUsedYear, LastUsedYear ) SELECT DISTINCT i.ITEM_CODE, '', 0, 0, 0 FROM dbo.ITEM AS i WHERE ( i.ITEM_CODE LIKE (@pITEMCODE + '%') OR ISNULL(@pITEMCODE, '') = '' ) AND i.ITEM_CODE NOT LIKE '%-S' ORDER BY i.ITEM_CODE DECLARE @SYear INT, @Year INT SELECT @SYear = YEAR(GETDATE()) - 5, @Year = YEAR(GETDATE()) WHILE @Year >= @SYear --从今年开始倒推 BEGIN IF @Year = YEAR(GETDATE()) --今年,第一年 BEGIN UPDATE iui SET iui.UsedYears = iui.UsedYears + 1, iui.FirstUsedYear = @Year, iui.LastUsedYear = @Year FROM #ItemUsedInfo AS iui WHERE iui.FirstUsedYear = 0 AND EXISTS ( SELECT 1 FROM #ItemTrans AS it WHERE it.ItemCode = iui.ItemCode AND it.yyyy = @Year AND it.qty > 0 ) END ELSE --非今年,倒推找今年的更新 BEGIN UPDATE iui SET iui.UsedYears = iui.UsedYears + 1, iui.FirstUsedYear = @Year FROM #ItemUsedInfo AS iui WHERE iui.FirstUsedYear = (@Year + 1) AND EXISTS ( SELECT 1 FROM #ItemTrans AS it WHERE it.ItemCode = iui.ItemCode AND it.yyyy = @Year AND it.qty > 0 ) END SELECT @Year = @Year - 1 END UPDATE iui SET iui.UsedInfo = ('连续' + CAST(iui.UsedYears AS VARCHAR(5)) + '年在用(' + CAST(iui.FirstUsedYear AS VARCHAR(5)) + '年至' + CAST(YEAR(GETDATE()) AS VARCHAR(5)) + '年,' + CAST(YEAR(i.CreateDate) AS VARCHAR(5)) + '年创建)' ) FROM #ItemUsedInfo AS iui INNER JOIN dbo.ITEM AS i ON i.ITEM_CODE = iui.ItemCode WHERE iui.UsedYears > 0 --无连续使用的,更新最后使用年份 INSERT INTO #ItemTrans2 ( ItemCode, yyyy, qty ) SELECT t2.ItemCode, t2.yyyy, t2.qty FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY t.ItemCode ORDER BY t.yyyy DESC) seq FROM (SELECT * FROM #ItemTrans AS it) t ) t2 WHERE t2.seq = 1 --更新最后使用年份 UPDATE iui SET iui.LastUsedYear = it.yyyy --, --iui.UsedYears = (YEAR(GETDATE()) - it.yyyy) FROM #ItemUsedInfo AS iui INNER JOIN #ItemTrans2 AS it ON it.ItemCode = iui.ItemCode WHERE ISNULL(iui.UsedInfo, '') = '' AND iui.UsedYears = 0 --按最后使用年份更新info UPDATE iui SET iui.UsedInfo = '' + CAST((YEAR(GETDATE()) - iui.LastUsedYear) AS VARCHAR(5)) + '年没使用(' + CAST((iui.LastUsedYear + 1) AS VARCHAR(5)) + '年至' + CAST(YEAR(GETDATE()) AS VARCHAR(5)) + '年,' + CAST(YEAR(i.CreateDate) AS VARCHAR(5)) + '年创建)' FROM #ItemUsedInfo AS iui INNER JOIN dbo.ITEM AS i ON i.ITEM_CODE = iui.ItemCode WHERE ISNULL(iui.UsedInfo, '') = '' AND iui.FirstUsedYear = 0 --AND iui.UsedYears > 0 AND iui.LastUsedYear > 0 --今年在用的 UPDATE iui SET iui.UsedInfo = '今年在用(' + CAST(YEAR(i.CreateDate) AS VARCHAR(5)) + '年创建)' FROM #ItemUsedInfo AS iui INNER JOIN dbo.ITEM AS i ON i.ITEM_CODE = iui.ItemCode WHERE iui.UsedYears = 1 AND iui.FirstUsedYear = YEAR(GETDATE()) --更新一直没使用的 UPDATE iui SET --iui.LastUsedYear = YEAR(i.CreateDate), --iui.UsedInfo = '' + CAST((YEAR(GETDATE()) - YEAR(i.CreateDate)) AS VARCHAR(5)) + '年没使用(' + CAST(YEAR(i.CreateDate) AS VARCHAR(5)) + '年创建至今)' iui.UsedInfo = (CASE WHEN (YEAR(GETDATE()) - YEAR(i.CreateDate) > 5) THEN ('超6年没使用(' + CAST(YEAR(i.CreateDate) AS VARCHAR(5)) + '年创建)') ELSE ('' + CAST((YEAR(GETDATE()) - YEAR(i.CreateDate) + 1) AS VARCHAR(5)) + '年没使用(' + CAST(YEAR(i.CreateDate) AS VARCHAR(5)) + '年至' + CAST(YEAR(GETDATE()) AS VARCHAR(5)) + '年,' + CAST(YEAR(i.CreateDate) AS VARCHAR(5)) + '年创建)' ) END ) FROM #ItemUsedInfo AS iui INNER JOIN dbo.ITEM AS i ON i.ITEM_CODE = iui.ItemCode WHERE ISNULL(iui.UsedInfo, '') = '' AND iui.UsedYears = 0 SELECT iui.ItemCode, iui.UsedInfo, iui.UsedYears, iui.FirstUsedYear, iui.LastUsedYear FROM #ItemUsedInfo AS iui ORDER BY iui.ItemCode END GO
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。