表A
PARTNO,PARTDESC,VENDO,GRADE,SALESTYPE,UNIT,    SUMQTY,     SHELF_LIFE
101-007 DICY M-07 A O KG 350 2011/06/23 1700
201-008 DICY N-99 A L KG 1600 2011/07/21 1000,2011/07/30 500,2011/08/18 1000能否把SHELF_LIFE字段拆成这样的显示
目的是可以进行数量运算
PARTNO,PARTDESC,VENDO,GRADE,SALESTYPE,UNIT,SUMQTY,SHELF_LIFE,  QTY 
101-007   DICY   M-07   A   O    KG  350   2011/06/23   1700
201-008   DICY   N-99   A   L    KG  1600   2011/07/21   1000   
201-008   DICY   N-99   A   L    KG  1600      2011/07/30    500
201-008   DICY   N-99   A   L    KG  1600      2011/08/18   1000

解决方案 »

  1.   

    --參考
    --拆分表:--> --> (Roy)生成測試數據
     
    if not object_id('Tab') is null
        drop table Tab
    Go
    Create table Tab([Col1] int,[COl2] nvarchar(5))
    Insert Tab
    select 1,N'a,b,c' union all
    select 2,N'd,e' union all
    select 3,N'f'
    Go--SQL2000用辅助表:
    if object_id('Tempdb..#Num') is not null
        drop table #Num
    go
    select top 100 ID=Identity(int,1,1) into #Num from syscolumns a,syscolumns b
    Select 
        a.Col1,COl2=substring(a.Col2,b.ID,charindex(',',a.Col2+',',b.ID)-b.ID) 
    from 
        Tab a,#Num b
    where
       substring(','+a.COl2,b.ID,1)=','
    --2000不适用辅助表
    Select
        a.Col1,COl2=substring(a.Col2,b.number,charindex(',',a.Col2+',',b.number)-b.number) 
    from 
        Tab a join master..spt_values  b 
        ON B.type='p' AND B.number BETWEEN 1 AND LEN(A.col2)
    where
         substring(','+a.COl2,b.number,1)=','
         --SQL2005用Xml:select 
        a.COl1,b.Col2
    from 
        (select Col1,COl2=convert(xml,'<root><v>'+replace(COl2,',','</v><v>')+'</v></root>') from Tab)a
    outer apply
        (select Col2=C.v.value('.','nvarchar(100)') from a.COl2.nodes('/root/v')C(v))b
    --SQL05用CTE:;with roy as 
    (select Col1,COl2=cast(left(Col2,charindex(',',Col2+',')-1) as nvarchar(100)),Split=cast(stuff(COl2+',',1,charindex(',',Col2+','),'') as nvarchar(100)) from Tab
    union all
    select Col1,COl2=cast(left(Split,charindex(',',Split)-1) as nvarchar(100)),Split= cast(stuff(Split,1,charindex(',',Split),'') as nvarchar(100)) from Roy where split>''
    )
    select COl1,COl2 from roy order by COl1 option (MAXRECURSION 0)--生成结果:
    /*
    Col1        COl2
    ----------- -----
    1           a
    1           b
    1           c
    2           d
    2           e
    3           f
    */
      

  2.   

    Select PARTNO,PARTDESC,VENDO,GRADE,SALESTYPE,UNIT,SUMQTY,
    SHELF_LIFE=left(substring(a.SHELF_LIFE,b.number,charindex(',',a.SHELF_LIFE+',',b.number)-b.number),
    CHARINDEX(substring(a.SHELF_LIFE,b.number,charindex(',',a.SHELF_LIFE+',',b.number)-b.number),' ')-1), 
     qty=STUFF(substring(a.SHELF_LIFE,b.number,charindex(',',a.SHELF_LIFE+',',b.number)-b.number),1,
     CHARINDEX(substring(a.SHELF_LIFE,b.number,charindex(',',a.SHELF_LIFE+',',b.number)-b.number),' ')-1,'')
    from 
        a join master..spt_values  b 
        ON B.type='p' AND B.number BETWEEN 1 AND LEN(A.SHELF_LIFE)
    where
         substring(','+a.SHELF_LIFE,b.number,1)=','
      

  3.   

    --> 测试数据: [A]
    if object_id('[A]') is not null drop table [A]
    create table [A] (PARTNO varchar(7),PARTDESC varchar(4),VENDO varchar(4),GRADE varchar(1),SALESTYPE varchar(1),UNIT varchar(2),SUMQTY int,SHELF_LIFE varchar(100))
    insert into [A]
    select '101-007','DICY','M-07','A','O','KG',350,'2011/06/23 1700' union all
    select '201-008','DICY','N-99','A','L','KG',1600,'2011/07/21 1000,2011/07/30 500,2011/08/18 1000'select top 100 ID=Identity(int,1,1) into #Num from syscolumns a,syscolumns b
    select PARTNO,PARTDESC,VENDO,GRADE,SALESTYPE,UNIT,SUMQTY,SHELF_LIFE=substring(ps,1,charindex(' ',ps)-1),qty=substring(ps,charindex(' ',ps)+1,len(ps))
     from
    (Select 
        a.partno,a.partdesc,a.vendo,a.grade,a.salestype,a.unit,a.sumqty,ps=substring(a.SHELF_LIFE,b.ID,charindex(',',a.SHELF_LIFE+',',b.ID)-b.ID) 
    from 
        [A] a,#Num b
    where
       substring(','+a.SHELF_LIFE,b.ID,1)=',')a
    --结果:PARTNO  PARTDESC VENDO GRADE SALESTYPE UNIT SUMQTY      SHELF_LIFE                                                                                           qty
    ------- -------- ----- ----- --------- ---- ----------- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
    101-007 DICY     M-07  A     O         KG   350         2011/06/23                                                                                           1700
    201-008 DICY     N-99  A     L         KG   1600        2011/07/21                                                                                           1000
    201-008 DICY     N-99  A     L         KG   1600        2011/07/30                                                                                           500
    201-008 DICY     N-99  A     L         KG   1600        2011/08/18                                                                                           1000
      

  4.   

    --为了看得清楚些 我借用临时表
    Select PARTNO,PARTDESC,VENDO,GRADE,SALESTYPE,UNIT,SUMQTY,
    SHELF_LIFE=substring(a.SHELF_LIFE,b.number,charindex(',',a.SHELF_LIFE+',',b.number)-b.number) 
     into #
    from 
        a join master..spt_values  b 
        ON B.type='p' AND B.number BETWEEN 1 AND LEN(A.SHELF_LIFE)
    where
         substring(','+a.SHELF_LIFE,b.number,1)=','
    --使用临时表
    select PARTNO,PARTDESC,VENDO,GRADE,SALESTYPE,UNIT,SUMQTY,
    SHELF_LIFE=left(SHELF_LIFE,charindex(' ',SHELF_LIFE)-1),
    qty=stuff(SHELF_LIFE,1,charindex(' ',SHELF_LIFE),'')
    from # 
      

  5.   


    ---------------------------------
    --  Author: htl258(Tony)
    --  Date  : 2009-08-20 16:08:26
    ---------------------------------
    --> 生成测试数据表:tbIf not object_id('[tb]') is null
    Drop table [tb]
    Go
    Create table [tb]([PARTNO] nvarchar(7),[PARTDESC] nvarchar(4),[VENDO] nvarchar(4),[GRADE] nvarchar(1),[SALESTYPE] nvarchar(1),[UNIT] nvarchar(2),[SUMQTY] int,[SHELF_LIFE] nvarchar(46))
    Insert tb
    Select '101-007','DICY','M-07','A','O','KG',350,'2011/06/23 1700' union all
    Select '201-008','DICY','N-99','A','L','KG',1600,'2011/07/21 1000,2011/07/30 500,2011/08/18 1000'
    Go
    --Select * from tb-->SQL查询如下:
    select a.[PARTNO],a.[PARTDESC],a.[VENDO],a.[GRADE],a.[SALESTYPE],a.[UNIT],a.[SUMQTY],LEFT(SHELF_LIFE,CHARINDEX(' ',SHELF_LIFE)-1) SHELF_LIFE,RIGHT(SHELF_LIFE,CHARINDEX(' ',reverse(SHELF_LIFE))-1)*1 QTY
    from (
    select
    a.[PARTNO],a.[PARTDESC],a.[VENDO],a.[GRADE],a.[SALESTYPE],a.[UNIT],a.[SUMQTY],
    [SHELF_LIFE]=substring(a.[SHELF_LIFE], b.number, charindex(',', a.[SHELF_LIFE] + ',', b.number) - b.number)
    from tb a,master..spt_values b 
    where b.type='p' 
    and substring(',' + a.[SHELF_LIFE],b.number,1) = ',' 
    ) as a/*
    PARTNO  PARTDESC VENDO GRADE SALESTYPE UNIT SUMQTY      SHELF_LIFE                                     QTY
    ------- -------- ----- ----- --------- ---- ----------- ---------------------------------------------- -----------
    101-007 DICY     M-07  A     O         KG   350         2011/06/23                                     1700
    201-008 DICY     N-99  A     L         KG   1600        2011/07/21                                     1000
    201-008 DICY     N-99  A     L         KG   1600        2011/07/30                                     500
    201-008 DICY     N-99  A     L         KG   1600        2011/08/18                                     1000(4 行受影响)
    */
      

  6.   

    if object_id('[A]') is not null
     drop table [A]
     go 
    create table [A] (PARTNO varchar(7),PARTDESC varchar(4),VENDO varchar(4),GRADE varchar(1),SALESTYPE varchar(1),UNIT varchar(2),SUMQTY int,SHELF_LIFE varchar(100))
    insert into [A]
    select '101-007','DICY','M-07','A','O','KG',350,'2011/06/23 1700' union all
    select '201-008','DICY','N-99','A','L','KG',1600,'2011/07/21 1000,2011/07/30 500,2011/08/18 1000'--为了看得清楚些 我借用临时表
    Select PARTNO,PARTDESC,VENDO,GRADE,SALESTYPE,UNIT,SUMQTY,
    SHELF_LIFE=substring(a.SHELF_LIFE,b.number,charindex(',',a.SHELF_LIFE+',',b.number)-b.number) 
     into #
    from 
        a join master..spt_values  b 
        ON B.type='p' AND B.number BETWEEN 1 AND LEN(A.SHELF_LIFE)
    where
         substring(','+a.SHELF_LIFE,b.number,1)=','
    --使用临时表
    select PARTNO,PARTDESC,VENDO,GRADE,SALESTYPE,UNIT,SUMQTY,
    SHELF_LIFE=left(SHELF_LIFE,charindex(' ',SHELF_LIFE)-1),
    qty=stuff(SHELF_LIFE,1,charindex(' ',SHELF_LIFE),'')
    from # 
    /*
    (4 行受影响)
    PARTNO  PARTDESC VENDO GRADE SALESTYPE UNIT SUMQTY      SHELF_LIFE                                                                                           qty
    ------- -------- ----- ----- --------- ---- ----------- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    101-007 DICY     M-07  A     O         KG   350         2011/06/23                                                                                           1700
    201-008 DICY     N-99  A     L         KG   1600        2011/07/21                                                                                           1000
    201-008 DICY     N-99  A     L         KG   1600        2011/07/30                                                                                           500
    201-008 DICY     N-99  A     L         KG   1600        2011/08/18                                                                                           1000*/     
      

  7.   

    这是7楼的修改过后的方法if object_id('[A]') is not null
     drop table [A]
     go 
    create table [A] (PARTNO varchar(7),PARTDESC varchar(4),VENDO varchar(4),GRADE varchar(1),SALESTYPE varchar(1),UNIT varchar(2),SUMQTY int,SHELF_LIFE varchar(100))
    insert into [A]
    select '101-007','DICY','M-07','A','O','KG',350,'2011/06/23 1700' union all
    select '201-008','DICY','N-99','A','L','KG',1600,'2011/07/21 1000,2011/07/30 500,2011/08/18 1000'--为了看得清楚些 我借用临时表
    Select PARTNO,PARTDESC,VENDO,GRADE,SALESTYPE,UNIT,SUMQTY,
    SHELF_LIFE=left(substring(a.SHELF_LIFE,b.number,charindex(',',a.SHELF_LIFE+',',b.number)-b.number),
    CHARINDEX(' ',substring(a.SHELF_LIFE,b.number,charindex(',',a.SHELF_LIFE+',',b.number)-b.number))-1), 
     qty=STUFF(substring(a.SHELF_LIFE,b.number,charindex(',',a.SHELF_LIFE+',',b.number)-b.number),1,
     CHARINDEX(' ',substring(a.SHELF_LIFE,b.number,charindex(',',a.SHELF_LIFE+',',b.number)-b.number))-1,'')
    from 
        a join master..spt_values  b 
        ON B.type='p' AND B.number BETWEEN 1 AND LEN(A.SHELF_LIFE)
    where
         substring(','+a.SHELF_LIFE,b.number,1)=','/*
    (4 行受影响)
    PARTNO  PARTDESC VENDO GRADE SALESTYPE UNIT SUMQTY      SHELF_LIFE                                                                                           qty
    ------- -------- ----- ----- --------- ---- ----------- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    101-007 DICY     M-07  A     O         KG   350         2011/06/23                                                                                           1700
    201-008 DICY     N-99  A     L         KG   1600        2011/07/21                                                                                           1000
    201-008 DICY     N-99  A     L         KG   1600        2011/07/30                                                                                           500
    201-008 DICY     N-99  A     L         KG   1600        2011/08/18                                                                                           1000*/     
      

  8.   

    PARTNO,PARTDESC,VENDO,GRADE,SALESTYPE,UNIT,SUMQTY,SHELF_LIFE,  QTY 
    101-007   DICY   M-07   A       O      KG          350      2011/06/23  1700 
    201-008   DICY   N-99   A       L      KG         1600      2011/07/21  1000  
    201-008   DICY   N-99   A       L      KG         1600      2011/07/30   500 
    201-008   DICY   N-99   A       L      KG         1600      2011/08/18  1000
    好象兄弟们的测试数据都没有这个数量 (兰色)