惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
Apple Machine Learning Research
Apple Machine Learning Research
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
M
MIT News - Artificial intelligence
腾讯CDC
B
Blog RSS Feed
H
Help Net Security
J
Java Code Geeks
有赞技术团队
有赞技术团队
Y
Y Combinator Blog
博客园_首页
Last Week in AI
Last Week in AI
博客园 - 【当耐特】
博客园 - Franky
B
Blog
MongoDB | Blog
MongoDB | Blog
博客园 - 叶小钗
Martin Fowler
Martin Fowler

博客园 - AaronLi

E10——打印行序 E10——BOM展下阶CTE写法 SQL&ERP——通过品号递归BOM往上找到最top的主件 E10——在线建档,单头取单身行的数据 SQLSERVER——XML转数据表输出(E10的PickList转成数据表) SQLServer数据库日志太大收缩操作指南 泛微OA——修改数据库密码 泛微OA——建模-查询,链接字段跳转到流程的路径写法 SQLSERVER——PIVOT列转行 SQL——练习:上展BOM SQL——练习:往下展开BOM SQL——CHARINDEX,找到字符(char)的位置(index) Sqlserver 根据年月获取第一天和最后一天 EXCEL生成GUID 多种格式 E10——智能菜单 [转] 判断表(临时表),存储过程是否存在 E10——凭证报表序号按流水自然排序 E10——函数GetTimeDiff(DateTime dt1,DateTime dt2,int type) E10——GetEntityProperty方法 E10——脚本中GUID的值如何判断是否相等?
E10——计算品号的使用情况(最近五年):连续X年在用
AaronLi · 2025-12-18 · via 博客园 - AaronLi
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