我有这样一个表:将逗号分隔的字符串选择为SQL Server中的连接列?
name orderid
bambino 4,5,6,7,8
我们怎样才能下面的例子在orderid
列值分成不同的列样的?
name order1 order2 order3 order4 order5
bambino 4 5 6 7 8
我有这样一个表:将逗号分隔的字符串选择为SQL Server中的连接列?
name orderid
bambino 4,5,6,7,8
我们怎样才能下面的例子在orderid
列值分成不同的列样的?
name order1 order2 order3 order4 order5
bambino 4 5 6 7 8
与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
如果你在你的OrderID列值的一个固定的量,这个问题也许可以帮助你:
Here是一个非常好的网页,关于如何将逗号分隔的字符串拆分为多行。有很多不同的方法,所以选择一种适合您的需求的方式。 (例如,CLR将比XML'hack'更快,但这可能不是问题。)
一旦将数据存入行中,您就可以使用PIVOT
将它变成列。如果你不知道有多少列,你可能需要在动态SQL中完成。
最简单的和动态查询这一点,如果你有百万订单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)
供您参考
喔这个查询不会介意。而添加此功能,它的帮助无论如何..
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
thnk you so much @Giorgi Nakeuri让我试试 –