gpt4 book ai didi

sql - 如何制作动态栏

转载 作者:行者123 更新时间:2023-12-02 05:31:56 25 4
gpt4 key购买 nike

我有一些数据如下

Declare @t table (Id int identity,CommaSeperatedValue varchar(100))
Insert Into @t
Select 'Somalia,Vietnam' Union All
Select 'apple,banana,guava,India,Australia'

CommaSeperated 值没有限制。所提供示例的所需输出将是

Id  Col1    Col2    Col3    Col4    Col5
1 Somalia Vietnam Null Null Null
2 apple banana guava India Australia

这意味着,列将动态生成。再举个例子

Declare @t table (Id int identity,CommaSeperatedValue varchar(100))
Insert Into @t
Select 'Somalia,Vietnam,Honolulu,Spain' Union All
Select 'apple,banana,guava,India,Australia,Smart,Bus' Union All
Select 'Mango'

期望的输出

Id  Col1    Col2    Col3    Col4    Col5        Col6    Col7    
1 Somalia Vietnam Honolulu Spain Null Null Null
2 apple banana guava India Australia Smart Bus
3 Mango Null Null Null Null Null Null

如何做这个查询?

到目前为止我的尝试(在此之后我迷路了)

SELECT 
X.id,
X.CommaSeperatedValue,
Y.splitdata
FROM
(
SELECT *,
CAST('<X>'+REPLACE(F.CommaSeperatedValue,',','</X><X>')+'</X>' AS XML) AS xmlfilter
FROM @t F
)X
CROSS APPLY
(
SELECT fdata.D.value('.','varchar(50)') as splitdata
FROM X.xmlfilter.nodes('X') as fdata(D)
)Y

提前致谢

最佳答案

这是您正在寻找的动态解决方案。我使用了临时表,您可以将其替换为永久表或表变量。

Declare @t table (Id int identity,CommaSeperatedValue varchar(100))
Insert Into @t
Select 'Somalia,Vietnam' Union All
Select 'apple,banana,guava,India,Australia'
IF object_ID('TempDB..#Temp') IS NOT NULL DROP TABLE #Temp;
SELECT
X.id,
--X.CommaSeperatedValue,
Y.splitdata
,ROW_NUMBER() OVER( PARTITION BY X.id ORDER BY X.id ) AS DataID
INTO #Temp
FROM
(
SELECT *,
CAST('<X>'+REPLACE(F.CommaSeperatedValue,',','</X><X>')+'</X>' AS XML) AS xmlfilter
FROM @t F
)X
CROSS APPLY
(
SELECT fdata.D.value('.','varchar(50)') as splitdata
FROM X.xmlfilter.nodes('X') as fdata(D)
)Y

DECLARE @MAXCol INT = (SELECT MAX(DataID)FROM #Temp)
,@index INT =1
,@ColNames varchar(4000)=''
WHILE (@index<=@MAXCol)
BEGIN
SET @ColNames =@ColNames +'MAX(CASE WHEN DataID = '+LTRIM(STR(@index))+' THEN splitdata END) as Col'+LTRIM(STR(@index))+','
SET @Index=@Index +1
END
SET @ColNames = LEFT(@ColNames,LEN(@ColNames)-1) -- Remove Last Comma
EXECUTE ( 'SELECT
[id],'+@ColNames+' FROM #Temp GROUP BY [id]'
)

关于sql - 如何制作动态栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12242131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com