首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求 sql?该怎么处理

2013-01-02 
求 sql?IF EXISTS ( SELECT1FROMtempdb.sys.sysobjectsWHEREname LIKE #TMP_ITM%AND xtype U )DROP

求 sql?


IF EXISTS ( SELECT  1
            FROM    tempdb.sys.sysobjects
            WHERE   name LIKE '#TMP_ITM%'
                    AND xtype = 'U' ) 
    DROP TABLE #TMP_ITM
GO
CREATE TABLE #TMP_ITM
    (
     MOTHER_ITEM_CD NVARCHAR(20) NOT NULL
    ,CHIDL_ITM_CD NVARCHAR(20) NOT NULL
    ,QTY DECIMAL(17, 4) NULL
    )
    
INSERT  INTO #TMP_ITM(MOTHER_ITEM_CD,CHIDL_ITM_CD,QTY )VALUES  ('000001','00002',10.0000 );
INSERT  INTO #TMP_ITM(MOTHER_ITEM_CD,CHIDL_ITM_CD,QTY )VALUES  ('000001','1012-10',20.0000 );
INSERT  INTO #TMP_ITM(MOTHER_ITEM_CD,CHIDL_ITM_CD,QTY )VALUES  ('1012-10','002',50.0000 );
INSERT  INTO #TMP_ITM(MOTHER_ITEM_CD,CHIDL_ITM_CD,QTY )VALUES  ('1012-10','1055-10',70.0000 );
INSERT  INTO #TMP_ITM(MOTHER_ITEM_CD,CHIDL_ITM_CD,QTY )VALUES  ('1055-10','LJKJL',100.0000 );

SELECT * FROM #TMP_ITM
/*
母ID子ID数量
MOTHER_ITEM_CDCHIDL_ITM_CDQTY
0000010000210.0000
0000011012-1020.0000
1012-1000250.0000
1012-101055-1070.0000
1055-10LJKJL100.0000
*/


/*
说明:
1。根据 MOTHER_ITEM_CD 插入 一条。。如,下面的 SEQ 等于 0,6,10 ITEM_CD 和 CHIDL_ITM_CD 都是 MOTHER_ITEM_CD。LV = 0 ,QTY 是 1.0000
2。然后 以 CHIDL_ITM_CD 为键 搜索 #TMP_ITM 表的 MOTHER_ITEM_CD,如 以 CHIDL_ITM_CD = 00002 来 搜索 MOTHER_ITEM_CD为 00002,
不存在==〉 插入 像 seq 等于 1   LV 是= 1 ,QTY 是 10.0000
如果存在==〉如 CHIDL_ITM_CD = 1012-10,CHIDL_ITM_CD = 1012-10 来 搜索 MOTHER_ITEM_CD为 1012-10 的 所有数据 依次 循环,

这里 有两条 
1012-1000250.0000
1012-101055-1070.0000(1055-10是1012-10的子ID,所以层次是 2, 1055-10 因为 存在 所以又搜索。。)

*/

/*
想要的结果
顺序层次数量
SEQITEM_CDCHIDL_ITM_CDLVQTY
000000100000101.0000
100000100002110.0000
20000011012-10120.0000
3000001002250.0000
40000011055-10270.0000
5000001LJKJL3100.0000

61012-101012-1001.0000
71012-10002150.0000
81012-101055-10170.0000
91012-10LJKJL2100.0000

101055-101055-1001.0000
111055-10LJKJL1100.0000

*/


[解决办法]
DECLARE @tb TABLE
    (
      MOTHER_ITEM_CD VARCHAR(20) NOT NULL ,
      CHIDL_ITM_CD VARCHAR(20) NOT NULL ,
      qty DECIMAL(17, 4) NOT NULL ,
      lvl INT NOT NULL
    )

DECLARE @root VARCHAR(20)

DECLARE CP_cursor CURSOR


FOR
    SELECT DISTINCT
            MOTHER_ITEM_CD
    FROM    dbo.TB
OPEN CP_cursor
FETCH NEXT FROM CP_cursor 
INTO @root ;
WHILE @@FETCH_STATUS = 0 
    BEGIN
        WITH    cte
                  AS ( SELECT   MOTHER_ITEM_CD ,
                                CHIDL_ITM_CD ,
                                qty ,
                                1 AS lvl
                       FROM     TB
                       WHERE    MOTHER_ITEM_CD = @root
                       UNION ALL
                       SELECT   cte.MOTHER_ITEM_CD ,
                                A.CHIDL_ITM_CD ,
                                CAST(cte.qty * A.qty AS DECIMAL(17, 4)) ,
                                cte.lvl + 1
                       FROM     cte
                                INNER JOIN TB A ON A.MOTHER_ITEM_CD = cte.CHIDL_ITM_CD
                     )
            INSERT  INTO @tb
                    ( MOTHER_ITEM_CD ,
                      CHIDL_ITM_CD ,
                      qty ,
                      lvl
                    )


                    SELECT  *
                    FROM    cte
                    UNION ALL
                    SELECT  MOTHER_ITEM_CD ,
                            MOTHER_ITEM_CD ,
                            1 ,
                            0
                    FROM    TB
                    WHERE   MOTHER_ITEM_CD = @root


        FETCH NEXT FROM CP_cursor 
    INTO @root ;
    END
CLOSE CP_cursor ;
DEALLOCATE CP_cursor ;

SELECT  ROW_NUMBER() OVER ( ORDER BY GETDATE() ) AS SEQ ,
        *
FROM    ( SELECT DISTINCT TOP 100 PERCENT
                    *
          FROM      @tb
          ORDER BY  MOTHER_ITEM_CD ,
                    lvl ASC
        ) A


/*
SEQ                  MOTHER_ITEM_CD       CHIDL_ITM_CD         qty                                     lvl
-------------------- -------------------- -------------------- --------------------------------------- -----------
1                    000001               000001               1.0000                                  0
2                    000001               00002                10.0000                                 1


3                    000001               002                  1000.0000                               2
4                    000001               1012-10              20.0000                                 1
5                    000001               1055-10              1400.0000                               2
6                    000001               LJKJL                140000.0000                             3
7                    1012-10              002                  50.0000                                 1
8                    1012-10              1012-10              1.0000                                  0
9                    1012-10              1055-10              70.0000                                 1
10                   1012-10              LJKJL                7000.0000                               2


11                   1055-10              1055-10              1.0000                                  0
12                   1055-10              LJKJL                100.0000                                1

(12 行受影响)

*/

热点排行
Bad Request.