求一条sql语句, sql数据格式如下:
类型 薪酬类型
KS01 KS01
类型 薪酬类型 城市 城市类型 数量(numeric(12,2))
KS01 KS01 1 BAS 100.00
KS01 KS01 1 CAR 1000.00
KS01 KS01 1 NET 10000.00
KS01 KS01 2 BAS 2.00
KS01 KS01 2 CAR 200.00
KS01 KS01 2 JET 2000.00
求一条sql 能将数据转换成以下格式. 城市和城市类型是动态可增加
类型 薪酬类型 城市 城市类型 数量
KS01 KS01 1 BAS 100.00 CAR 1000.00 NET 10000.00
KS01 KS01 2 BAS 2.00 CAR 200.00 NET 2000.00
必须要一句sql???
--拼数据 select 城市,城市类型,城市+城市类型+'k' as r into #t from t union select 城市,cast(数量 as varchar(50)),城市+城市类型+'v' from t order by r asc --处理数据 update #t set r=SUBSTRING(r,2,len(r)) --定义变量 declare @dynamicSql varchar(4096), @cols varchar(1024)='', @colsAndName varchar(2048)='' --生成动态列 select @cols=@cols+'['+r+'],' from (select distinct r from #t) t; select @colsAndName=@colsAndName+'['+r+'] as '+(case when r like '%k' then '城市' else '数量' end)+',' from (select distinct r from #t) t; --动态查询 set @dynamicSql=' select t2.类型,t2.薪酬类型,t2.城市,'+SUBSTRING(@colsAndName,0,LEN(@colsAndName))+' from (select distinct 类型,薪酬类型,城市 from t) t2 left join (select * from #t pivot ( max(城市类型) for r in ('+SUBSTRING(@cols,0,LEN(@cols))+') )pvt) t3 on t3.城市=t2.城市' print @dynamicSql exec (@dynamicSql)
@幻天芒: 结果如下:
类型 薪酬类型 城市 城市 数量 城市 数量 城市 数量 KS01 KS01 1 BAS 100 CAR 1000 NET 10000 KS01 KS01 2 BAS 2 CAR 200 NET 2000
@幻天芒:
谢谢大哥,但是第二查询后,
消息 2714,级别 16,状态 6,第 2 行
数据库中已存在名为 '#e' 的对象。
应该怎么清除临时表呢
@悠悠思丶: drop table #e,这样就能删除临时表;
@幻天芒:
谢谢老兄,搞定了,一会儿结贴
@悠悠思丶: 这个我一般都在C#代码中搞定,然后在前台拼接。
老兄格式还是有点儿不对, 查出来是这种各种是不对的,红色框起来要在一行内显 city_level可以不显示示, @幻天芒:
@悠悠思丶: 不要是按照城市分组么???
@幻天芒: 嗯,是按城市的, 城市下有多种BAS CAR NET W01 W02 W03 等类型。这张是子表
主表有job_type wage_level 关联这个子表 ,一行要列出5类或更多城市
@悠悠思丶: @幻天芒:
@悠悠思丶: 我看不到图的,防火墙~
@幻天芒: 能加qq吗 124066483 初学者,复杂sql不太会
@悠悠思丶: 我Q:one zero two eight double three double two seven three~
@幻天芒: 兄弟,我加了你qq,是叫幻精灵嘛, 在麻烦你15分钟咯,我在送你100豆 好不,,撒
@悠悠思丶: 上班时间没QQ,只有晚上才能看的呢。
@幻天芒: 嗯啊,我已经搞定那些了,就您之前提供的答案,我想改改列显示,只显示 数量 就行了,你现在方便吗,我急用
@悠悠思丶: 额,QQ肯定是没法的,你可以贴下你要的显示效果~
@幻天芒: 就是你上面发给我看的格式, 不过只需要数量就行了,其他字段都不要
@悠悠思丶: 那你需要修改“生成动态列”的那段代码,让列只处理数量。
@幻天芒: 我改了几次都不太会,所以你帮下我喽,谢谢啦
@悠悠思丶: select @colsAndName=@colsAndName+'['+r+'] as '+(case when r like '%k' then '城市' else '数量' end)+',' from (select distinct r from #t) t where t.r not like '%k';
应该是这样改,你试试呢~
@幻天芒: 嗯,谢谢,麻烦你了,学习了。
@悠悠思丶: :)
查找的数据个数怎么跟字段个数不对啊?
查询的结果是不是这样的:
类型 薪酬类型 城市 BAS CAR NET
KS01 KS01 1 100.00 1000.00 10000.00
KS01 KS01 2 2.00 200.00 2000.00
如果结果是上面的那样可以试一下:
declare @city nvarchar(100)
declare @sql nvarchar(200)=''
select @city=isnull(@city+',','')+quotename(a.城市类型) from (select distinct(城市类型) from table) a
set @sql='select c.* from table b pivot(sum(b.数量) for b.城市类型 in('+@city+')) c'
麻烦的转换,你可以尝试下用临时表来处理,更清晰
select distinct 类型,薪酬类型,城市, (SELECT 城市类型+' '+数量 + ' ' FROM ks where 城市=a.[城市] FOR XML PATH('')) as 城市类型_数量 from KS a
消息 8114,级别 16,状态 5,第 1 行
从数据类型 varchar 转换为 numeric 时出错。
@悠悠思丶:
select distinct 类型,薪酬类型,城市, (SELECT 城市类型+' '+cast(数量 as varchar(50))+ ' ' FROM ks where 城市=a.[城市] FOR XML PATH('')) as 城市类型_数量 from KS a
城市数量能分开吗, 数据类型没问题,
@悠悠思丶: 不明白 你想要的格式
@Yu:
要这样的?
@Yu:
类型 薪酬类型 城市 类型 数量 类型 数量 类型 数量
KS01 KS01 1 BAS 100 CAR 1000 NET 10000
KS01 KS01 2 BAS 2 CAR 200 NET 2000
@悠悠思丶: @幻天芒:
谢谢老兄,搞定了,一会儿结贴