【发布时间】:2016-09-08 15:00:52
【问题描述】:
我试图将 csv 拆分为单独的列
样本数据
PAR_COLUMN PERIOD VALUE mul_query
---------- ------ --------- ---------
1 601 10.134542 10.134542
1 602 20.234234 10.134542*20.234234
1 603 30.675643 10.134542*20.234234*30.675643
1 604 40.234234 10.134542*20.234234*30.675643*40.234234
2 601 10.345072 10.345072
2 602 20.345072 10.345072*20.345072
2 603 30.345072 10.345072*20.345072*30.345072
2 604 40.345072 10.345072*20.345072*30.345072*40.345072
预期结果:
PAR_COLUMN period value (No column name) (No column name) (No column name) (No column name)
---------- ------ --------- ---------------- ---------------- ---------------- ---------------
1 601 10.134542 10.134542 1 1 1
1 602 20.234234 10.134542 20.234234 1 1
1 603 30.675643 10.134542 20.234234 30.675643 1
1 604 40.234234 10.134542 20.234234 30.675643 40.234234
2 601 10.345072 10.345072 1 1 1
2 602 20.345072 10.345072 20.345072 1 1
2 603 30.345072 10.345072 20.345072 30.345072 1
2 604 40.345072 10.345072 20.345072 30.345072 40.345072
我试过这样。当数据很大时,它可以工作,但速度很慢。有没有更好的选择。
declare @sql varchar(max) = ''
set @sql =
';WITH Split_Names
AS
(
SELECT PAR_COLUMN,
mul_query,period,
CONVERT(XML,''<Names><name>''
+ REPLACE(mul_query,''*'', ''</name><name>'') + ''</name></Names>'') AS xmlname
FROM #finals
)
SELECT PAR_COLUMN,
period,
'
declare @start int =1 ,@count int
set @count = (select (max(period) - min(period))+1 from #finals)
while @start <= @count
begin
set @sql +=concat( 'isnull(xmlname.value(''/Names[1]/name[',@start,']'',''float''),1) , ')
set @start+=1
end
set @sql =left(@sql,len(@sql)-1)
set @sql+= ' FROM Split_Names'
exec( @sql)
注意:问题是不将CSV 转换为个人Rows。我正在尝试将CSV 转换为个人Columns 基本上我试图在Value 列中计算RUNNING Multiplication
【问题讨论】:
-
是否有最大列数?
-
您正在动态地将字段转换为 xml,然后将该 xml 拆分。它总是很慢,因为必须对表中的每一行重复该操作。你最好修复你的表结构,这样它就不会首先这样做。使用适当的标准化设计。
-
T-SQL split string的可能重复
-
注:使用欺骗问题链接,您可以
CROSS JOIN传递列进行拆分的函数。 -
SQL Server 不是拆分字符串的好工具。更好的办法是在 .NET、Java 等中完成繁重的工作,然后导入规范化数据。
标签: sql sql-server tsql sql-server-2012