超难超复杂的sql 数据格式转换问题。。。。

tangtang89522 2011-09-01 09:24:32
以下为原始数据
H钢材 上海 北京 广州
200*100 4239 4321 4500
涨跌幅 - - -
产地 马钢 莱阳 湖州
100*123 3451 3211 3245
涨跌幅 -10 - -
产地 马钢 莱阳 湖州


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 - 湖州

目前还没找到合适的方法来转换,麻烦各位大侠给出点思路。。。谢谢。


...全文
151 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ss2369 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fredrickhu 的回复:]
引用 3 楼 tangtang89522 的回复:
本人已解决了。。。。呵呵。。


gx
[/Quote]

大哥 加个好友行吗 我QQ 151254200
AcHerat 2011-09-01
  • 打赏
  • 举报
回复
学习。
chuanzhang5687 2011-09-01
  • 打赏
  • 举报
回复
来蹭点分![Quote=引用 3 楼 tangtang89522 的回复:]

本人已解决了。。。。呵呵。。
[/Quote]
--小F-- 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tangtang89522 的回复:]
本人已解决了。。。。呵呵。。
[/Quote]

gx
-晴天 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tangtang89522 的回复:]
我也知道 不宜在 数据库里解决 如果放在 程序里 不一会就万事了。。可是 没办法。。有些时候 只能在这里解决。。。

我贴一下 部分代码吧。。呵呵希望 有用。。

SQL code

/*
思路:
1:建立一个函数,函数的传入参数 为每一个日期段的数据,然后返回一个转换成功的表
2:由规格总数 乘以 城市总数 得出 总行数

此方法不包括涨跌幅的抓取
*/

decla……
[/Quote]

V5
tangtang89522 2011-09-01
  • 打赏
  • 举报
回复
我也知道 不宜在 数据库里解决 如果放在 程序里 不一会就万事了。。可是 没办法。。有些时候 只能在这里解决。。。

我贴一下 部分代码吧。。呵呵希望 有用。。

/*
思路:
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)

geniuswjt 2011-09-01
  • 打赏
  • 举报
回复
威武!恭喜[Quote=引用 3 楼 tangtang89522 的回复:]

本人已解决了。。。。呵呵。。
[/Quote]
-晴天 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tangtang89522 的回复:]
本人已解决了。。。。呵呵。。
[/Quote]
高家庄的高!
tangtang89522 2011-09-01
  • 打赏
  • 举报
回复
本人已解决了。。。。呵呵。。
geniuswjt 2011-09-01
  • 打赏
  • 举报
回复
最近转不动了。。。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧