首页 > 数据库 >SQL——练习:往下展开BOM

SQL——练习:往下展开BOM

时间:2023-04-20 17:34:07浏览次数:40  
标签:-- 练习 ITEM BOM SQL DATE tb ID



--练习:往下展开BOM
IF EXISTS
(
    SELECT *
    FROM tempdb.dbo.sysobjects
    WHERE id = OBJECT_ID(N'tempdb.dbo.#temp_bom')
) --是否存在该临时表
    DROP TABLE #temp_bom --存在则删除

CREATE TABLE #temp_bom --创建临时表
(
    ROOT_ITEM_ID UNIQUEIDENTIFIER,   --根品号
    TOTAL_SEQ NVARCHAR(200),         --层级关系
    SEQ INT,                         --序号
    LEV INT,                         --层次
    BOM_ID UNIQUEIDENTIFIER,
    BOM_D_ID UNIQUEIDENTIFIER,
    PARENT_ITEM_ID UNIQUEIDENTIFIER, --父级品号
    ITEM_ID UNIQUEIDENTIFIER,        --自身品号
    EFFECTIVE_DATE DATE,             --生效日期
    EXPRITY_DATE DATE,               --失效日期
    QTY_PER DECIMAL(16, 6)           --组成用量
)

DECLARE @ITEM_CODE VARCHAR(20),
        @CurrentLevel AS INT,
        @Level INT,
        @IsBottom INT -- 0-多阶,1-尾阶

SELECT @ITEM_CODE = '210010001', --130010005
       @Level = 20,
       @IsBottom = 0

INSERT INTO #temp_bom
(
    ROOT_ITEM_ID,
    TOTAL_SEQ,
    SEQ,
    LEV,
    BOM_ID,
    BOM_D_ID,
    PARENT_ITEM_ID,
    ITEM_ID,
    EFFECTIVE_DATE,
    EXPRITY_DATE,
    QTY_PER
)
SELECT b.ITEM_ID AS ROOT_ITEM_ID,
       '0001' AS TOTAL_SEQ,
       1 AS SEQ,
       0 AS LEV,
       b.BOM_ID AS BOM_ID,
       '00000000-0000-0000-0000-000000000000' AS BOM_D_ID,
       '00000000-0000-0000-0000-000000000000' AS PARENT_ITEM_ID,
       b.ITEM_ID AS ITEM_ID,
       CAST('1900-01-01' AS DATE) AS EFFECTIVE_DATE,
       CAST('1900-01-01' AS DATE) AS EXPRITY_DATE,
       1 AS QTY_PER
FROM dbo.BOM AS b
    INNER JOIN dbo.ITEM AS i
        ON i.ITEM_BUSINESS_ID = b.ITEM_ID
WHERE i.ITEM_CODE = @ITEM_CODE
      AND b.Owner_Org_ROid = 'C8BAE02C-0A60-4FD0-46A9-12140D245E5D'



SELECT @CurrentLevel = 1

WHILE @CurrentLevel <= @Level
BEGIN

    INSERT INTO #temp_bom
    (
        ROOT_ITEM_ID,
        TOTAL_SEQ,
        SEQ,
        LEV,
        BOM_ID,
        BOM_D_ID,
        PARENT_ITEM_ID,
        ITEM_ID,
        EFFECTIVE_DATE,
        EXPRITY_DATE,
        QTY_PER
    )
    SELECT tb.ROOT_ITEM_ID,                                                                          -- ROOT_ITEM_ID - uniqueidentifier
           tb.TOTAL_SEQ,                                                                             -- TOTAL_SEQ - nvarchar(200)
           (ROW_NUMBER() OVER (PARTITION BY tb.ROOT_ITEM_ID, b.ITEM_ID ORDER BY bd.SequenceNumber)), -- SEQ - int
           @CurrentLevel,                                                                            -- LEV - int
           b.BOM_ID,                                                                                 -- BOM_ID - uniqueidentifier
           bd.BOM_D_ID,                                                                              -- BOM_D_ID - uniqueidentifier
           b.ITEM_ID,                                                                                -- PARENT_ITEM_ID - uniqueidentifier
           bd.SOURCE_ID_ROid,                                                                        -- ITEM_ID - uniqueidentifier
           bd.EFFECTIVE_DATE,                                                                        -- EFFECTIVE_DATE - date
           bd.EXPRITY_DATE,                                                                          -- EXPRITY_DATE - date
           bd.QTY_PER                                                                                -- QTY_PER - decimal(16, 6)
    FROM #temp_bom AS tb
        INNER JOIN dbo.BOM AS b
            ON b.ITEM_ID = tb.ITEM_ID
               AND b.Owner_Org_ROid = 'C8BAE02C-0A60-4FD0-46A9-12140D245E5D'
        INNER JOIN dbo.BOM_D AS bd
            ON bd.BOM_ID = b.BOM_ID
    WHERE tb.LEV = @CurrentLevel - 1
          AND
          (
              bd.EXPRITY_DATE = '9998-12-31 00:00:00.0000000'
              OR bd.EXPRITY_DATE >= GETDATE()
          )
          AND
          (
              bd.EFFECTIVE_DATE = '1900-01-01 00:00:00.0000000'
              OR bd.EFFECTIVE_DATE <= GETDATE()
          )
    ORDER BY tb.ROOT_ITEM_ID,
             b.ITEM_ID,
             bd.SequenceNumber

    IF @@ROWCOUNT = 0
    BEGIN
        BREAK
    END

    UPDATE tb
    SET tb.TOTAL_SEQ = tb.TOTAL_SEQ + '.' + RIGHT('1000' + CAST(tb.SEQ AS VARCHAR(4)), 4)
    FROM #temp_bom AS tb
    WHERE tb.LEV = @CurrentLevel

    SELECT @CurrentLevel += 1
END

IF @IsBottom = 1
BEGIN
    DELETE tb
    FROM #temp_bom AS tb
    WHERE tb.LEV > 0
          AND EXISTS
    (
        SELECT 1 FROM #temp_bom AS tb2 WHERE tb2.PARENT_ITEM_ID = tb.ITEM_ID
    )
END



SELECT tb.ROOT_ITEM_ID,
       i.ITEM_CODE 根品号,
       --i.ITEM_NAME,
       tb.TOTAL_SEQ,
       tb.SEQ,
       tb.LEV,
       tb.PARENT_ITEM_ID,
       i2.ITEM_CODE 父品号,
       --i2.ITEM_NAME,
       tb.ITEM_ID,
       i3.ITEM_CODE 元件品号,
       --i3.ITEM_NAME,
       tb.EFFECTIVE_DATE,
       tb.EXPRITY_DATE,
       tb.QTY_PER
FROM #temp_bom AS tb
    LEFT JOIN dbo.ITEM AS i
        ON i.ITEM_BUSINESS_ID = tb.ROOT_ITEM_ID
    LEFT JOIN dbo.ITEM AS i2
        ON i2.ITEM_BUSINESS_ID = tb.PARENT_ITEM_ID
    LEFT JOIN dbo.ITEM AS i3
        ON i3.ITEM_BUSINESS_ID = tb.ITEM_ID
ORDER BY tb.TOTAL_SEQ

 





 

标签:--,练习,ITEM,BOM,SQL,DATE,tb,ID
From: https://www.cnblogs.com/xiaoli9627/p/17337602.html

相关文章

  • MySQL GTID 主从复制错误修复方法
    MySQL传统的主从复制方式使用master_log_files和master_log_pos两个参数来确定复制位点。当出现复制错误时,可以设置跳过出错的事务来恢复同步,MySQL提供了sql_slave_skip_counter参数来实现此功能。使用方法如下:root@(none)>stopslave;QueryOK,0rowsaffected(0.0......
  • 24道Python面试练习题
    1.简述函数式编程答:在函数式编程中,函数是基本单位,变量只是一个名称,而不是一个存储单元。除了匿名函数外,Python还使用fliter(),map(),reduce(),apply()函数来支持函数式编程。2.什么是匿名函数,匿名函数有什么局限性答:匿名函数,也就是lambda函数,通常用在函数体比较简单的函数上。......
  • Mysql语法
    树形结构通过节点获取节点所有上级(函数)1createfunctionget_department_list(in_idint)returnsvarchar(100)2READSSQLDATA3begin4declareidsvarchar(1000);5declaretempidint;67settempid=in_id;8whiletempid>0d......
  • MySQL使用过程中常见问题的解决
    问题1:root用户密码忘记,重置的操作、1:通过任务管理器或者服务管理,关掉mysqld(服务进程)2:通过命令行+特殊参数开启mysqldmysqld--defaults-file="D:\ProgramFiles\mysql\MySQLServer5.7Data\my.ini"--skip-grant-tables3:此时,mysqld服务进程已经打开。并且不需......
  • Sql Server 数据库优化
    从高明到普通一共有4种优化方式:1、架构优化:最优解,一般来说在高并发的场景下对架构层进行优化其效果最为明显,常见的优化手段有:分布式缓存,读写分离,分库分表等,每种优化手段又适用于不同的应用场景。2、硬件优化:有钱能使鬼推磨,性能差了、反应慢了,就更新/迭代,从物理层次高纬度打击,机......
  • MySQL: 为什么使用 innobackupex 备份恢复搭建主从时,必须人为设置 gtid_purged 变量
    问题描述:使用innobackupex搭建主从的步骤如下:1.主库使用innobackupex备份并apply-log2.将备份文件拷贝至从库,从库清空datadir目录,并使用innobackupex进行copy-back3.从库根据备份目录中的xtrabackup_binlog_info的GTID信息来设置gtid_purged变量。4.从库changem......
  • 48 结束语 | 点线网面,一起构建MySQL知识网络
    时光流逝,这是专栏的最后一篇文章。回顾整个过程,如果用一个词来描述,就是“没料到”:我没料到文章这么难写,似乎每一篇文章都要用尽所学;我没料到评论这么精彩,以致于我花在评论区的时间并不比正文少;我没料到收获这么大,每一次被评论区的提问问到盲点,都会带着久违的兴奋去分析代码。......
  • 47 直播回顾 | 林晓斌:我的 MySQL 心路历程【无音频】
    在专栏上线后的11月21日,我来到极客时间做了一场直播,主题就是“我的MySQL心路历程”。今天,我特意将这个直播的回顾文章,放在了专栏下面,希望你可以从我这些年和MySQL打交道的经历中,找到对你有所帮助的点。这里,我先和你说一下,在这个直播中,我主要分享的内容:我和MySQL打交道的经历;......
  • 3 02 | 日志系统:一条SQL更新语句是如何执行的?
    前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。那么,一条更新语句的执行流程又是怎样的呢?之前你可能经常听DBA同事说,MySQL可以恢复到半......
  • 2 01 | 基础架构:一条SQL查询语句是如何执行的?
    你好,我是林晓斌。这是专栏的第一篇文章,我想来跟你聊聊MySQL的基础架构。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于MySQL的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单的表,表里只有......