表编号   产品   数量   单价   金额    序列号001     AA     3     5      15   12,13,14002     bb     3     5      15   22,23,24现在需要显示的效果为编号   产品   数量   单价   金额    序列号001     AA     1     5      5   12
001     AA     1     5      5   13
001     AA     1     5      5   14002     bb     1     5      5   22
002     bb     1     5      5   23
002     bb     1     5      5   24

解决方案 »

  1.   

    ----------------------------------------------------------------
    -- Author  :DBA_Huangzj(發糞塗牆)
    -- Date    :2013-09-17 15:03:36
    -- Version:
    --      Microsoft SQL Server 2014 (CTP1) - 11.0.9120.5 (X64) 
    -- Jun 10 2013 20:09:10 
    -- Copyright (c) Microsoft Corporation
    -- Enterprise Evaluation Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
    --
    ----------------------------------------------------------------
    --> 测试数据:[huang]
    if object_id('[huang]') is not null drop table [huang]
    go 
    create table [huang]([编号] varchar(3),[产品] varchar(2),[数量] int,[单价] int,[金额] int,[序列号] varchar(8))
    insert [huang]
    select '001','AA',3,5,15,'12,13,14' union all
    select '002','bb',3,5,15,'22,23,24'
    --------------开始查询--------------------------select 编号 ,  产品 ,  数量,   单价 ,  金额,SUBSTRING([序列号],number,CHARINDEX(',',[序列号]+',',number)-number) as [序列号]
    from [huang] a,master..spt_values 
    where
        number >=1 and number<len([序列号])  
        and type='p' 
        and substring(','+[序列号],number,1)=','
    ----------------结果----------------------------
    /* 
    编号   产品   数量          单价          金额          序列号
    ---- ---- ----------- ----------- ----------- --------
    001  AA   3           5           15          12
    001  AA   3           5           15          13
    001  AA   3           5           15          14
    002  bb   3           5           15          22
    002  bb   3           5           15          23
    002  bb   3           5           15          24
    */
      

  2.   


    --字段拆分:
    IF OBJECT_ID('tempdb..#temp') IS NOT NULL
     DROP TABLE #temp
    GO
    CREATE TABLE #temp
    (
     编号 INT IDENTITY,
    产品 nvarchar(max),
    数量 int,
    单价 int,
    金额 int,
     序列号 NVARCHAR(MAX)
    )
    INSERT #temp
    SELECT   'AA',3,5,15,'12,13,14' UNION ALL
    SELECT 'bb',3,5,15,'22,23,24' 
    GO
    select * from #temp
    --#1.SQL2000 辅助表拆分方法
    SELECT 
     a.编号,a.产品,a.数量,a.单价,a.金额,
     序列号 = SUBSTRING(a.序列号, b.number, CHARINDEX(',', a.序列号+',', b.number) - b.number)
    FROM #temp a
     INNER JOIN master..spt_values b
      ON b.type = 'p' AND b.number BETWEEN 1 AND LEN(a.序列号)
    WHERE SUBSTRING(','+a.序列号, b.number, 1) = ','
      

  3.   

    --SQL2005 CTE递归方法
    ;WITH cte AS  
    (
     SELECT
      编号,
    产品,数量,单价,金额,
      序列号 = CAST(LEFT(序列号, CHARINDEX(',', 序列号 + ',') - 1) AS NVARCHAR(MAX)),
      Split = CAST(STUFF(序列号 + ',', 1, CHARINDEX(',', 序列号 + ','), '') AS NVARCHAR(MAX))
     FROM #temp
     UNION ALL
     SELECT
      编号,
    产品,数量,单价,金额,
      序列号 = CAST(LEFT(Split, CHARINDEX(',', Split) - 1) AS NVARCHAR(MAX)),
      Split = CAST(STUFF(Split, 1, CHARINDEX(',', Split), '') AS NVARCHAR(MAX))
     FROM cte
     WHERE Split > ''
    )
    SELECT
        编号,
    产品,数量,单价,金额,
        序列号
    FROM cte
    ORDER BY 编号
    OPTION (MAXRECURSION 0)
      

  4.   

    亲,我看着你master..spt_values这个东西好用呢嘛,怎么用啊?
      

  5.   

    亲,我看着你master..spt_values这个东西好用呢嘛,怎么用啊?自己SELECT一下就知道里面是啥了
      

  6.   

    亲,我看着你master..spt_values这个东西好用呢嘛,怎么用啊?自己SELECT一下就知道里面是啥了
    貌似里面有一列number里面有一些就是1,2,3,4,5,但是不会哦