2015-06-11 32 views

回答

0

xml一些技巧,然后旋转:

DECLARE @t TABLE 
    (
     name VARCHAR(20) , 
     orderid VARCHAR(20) 
    ) 

INSERT INTO @t 
VALUES ('chao', '1,2,3'), 
     ('bambino', '4,5,6,7,8'); 
WITH cte 
      AS (SELECT name , 
         Split.a.value('.', 'VARCHAR(100)') AS orderid , 
         ROW_NUMBER() OVER (PARTITION BY name ORDER BY (SELECT 
                   NULL 
                  )) rn 
       FROM  (SELECT name , 
            CAST ('<M>' + REPLACE(orderid, ',', 
                  '</M><M>') + '</M>' AS XML) AS orderid 
          FROM  @t 
         ) AS A 
         CROSS APPLY orderid.nodes('/M') AS Split (a) 
      ) 
    SELECT name , 
      [1] AS order1 , 
      [2] AS order2 , 
      [3] AS order3 , 
      [4] AS order4 , 
      [5] AS order5 , 
      [6] AS order6 , 
      [7] AS order7 , 
      [8] AS order8 , 
      [9] AS order9 , 
      [10] AS order10 
    FROM cte PIVOT(MAX(orderid) FOR rn IN ([1], [2], [3], [4], [5], [6], 
               [7], [8], [9], [10])) p 

输出:

name order1 order2 order3 order4 order5 order6 order7 order8 order9 order10 
bambino 4  5  6  7  8  NULL NULL NULL NULL NULL 
chao 1  2  3  NULL NULL NULL NULL NULL NULL NULL 
+0

thnk you so much @Giorgi Nakeuri让我试试 –

0

Here是一个非常好的网页,关于如何将逗号分隔的字符串拆分为多行。有很多不同的方法,所以选择一种适合您的需求的方式。 (例如,CLR将比XML'hack'更快,但这可能不是问题。)

一旦将数据存入行中,您就可以使用PIVOT将它变成列。如果你不知道有多少列,你可能需要在动态SQL中完成。

0

最简单的和动态查询这一点,如果你有百万订单orderid

declare @name as nvarchar(50), @orderid as nvarchar(50), @dorders as nvarchar(max)='',@count as int = 1 
select @name=name, @orderid=orderid from abc -- add here where clause to select particular row 
select @dorders = @dorders + splitdata + ' as [Order'+convert(nvarchar(10),@count)+'],', @count = @count + 1 from fnsplitstring(@orderid,',') 
set @dorders = SUBSTRING(@dorders,0,len(@dorders)) 
declare @Dsql as nvarchar(max) = 'select '''[email protected]+''' as name, '[email protected] 
exec (@Dsql) 

供您参考

enter image description here

喔这个查询不会介意。而添加此功能,它的帮助无论如何..

CREATE FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
     IF @end = 0 
      SET @end = LEN(@string) + 1 

     INSERT INTO @output (splitdata) 
     VALUES(SUBSTRING(@string, @start, @end - @start)) 
     SET @start = @end + 1 
     SET @end = CHARINDEX(@delimiter, @string, @start) 

    END 
    RETURN 
END 
+0

当你的桌子有两排或多排时会发生什么? – ughai

+0

**注意:**如果您打算使用并推荐基于SQL的分离器,由Jeff Moden创建的'DelimitedSplit8K'就是事实。你可以阅读更多关于它[这里](http://www.sqlservercentral.com/articles/Tally+Table/72993/)及其性能比较[here](http://sqlperformance.com/2012/07/t -SQL的查询/分割字符串)。 – ughai

+0

OP在这里询问单行命名'bambino',如果他增加了这个问题,我将不得不改变查询 –

相关问题