22,209
社区成员
发帖
与我相关
我的任务
分享
create table test
(
c1 varchar(50),
c2 varchar(50),
c3 varchar(50),
c4 varchar(50)
)
insert into test
select 'H钢材', '上海', '北京', '广州'
union all
select '200*100', '4239', '4321', '4500'
union all
select '涨跌幅', '-', '-', '-'
union all
select '产地', '马钢', '莱阳', '湖州'
union all
select '100*123', '3451', '3211', '3245'
union all
select '涨跌幅', '-10', '-', '-'
union all
select '产地', '马钢', '莱阳', '湖州'
需要转换的格式:
H钢材 上海 200*100 4239 - 马钢
H钢材 上海 100*123 3451 -10 马钢
H钢材 北京 200*100 4321 - 莱阳
H钢材 北京 100*123 3211 - 莱阳
H钢材 广州 200*100 4500 - 湖州
H钢材 广州 100*123 3245 - 湖州
目前还没找到合适的方法来转换,麻烦各位大侠给出点思路。。。谢谢。
/*
思路:
1:建立一个函数,函数的传入参数 为每一个日期段的数据,然后返回一个转换成功的表
2:由规格总数 乘以 城市总数 得出 总行数
此方法不包括涨跌幅的抓取
*/
declare @i int,@j int,@count int,@sql varchar(max),@guige varchar(50)
select @count=(select count(*) from #test where charindex('*',c1)>0),@sql=''
set @i=0
--初始化规格等级
set @guige= (select top 1 c1 from (select * from #test where charindex('*',c1)>0 ) a)
--规格 循环
while @i<>@count
begin
if @guige<>'' set @guige=(select top 1 c1 from (select * from #test where charindex('*',c1)>0 ) a where c1<>@guige)
set @j=1
--城市循环
while @j<>4
begin
set @sql='
select
(select top 1 c1 from #test),
(select top 1 c'+cast(@j+1 as varchar(10))+' from #test),
/*(select top 1 c'+cast(@j+1 as varchar(10))+' from test where c1=''涨跌幅''),*/
(select c'+cast(@j+1 as varchar(10))+' from #test where c1=''产地''),
(select top 1 c'+cast(@j+1 as varchar(10))+' from #test where c1='''+@guige+''')
union all
'+@sql
set @j=@j+1
end
set @i=@i+1
end
set @sql=left(@sql,len(@sql)-13)
exec(@sql)