首页 新闻 会员 周边 捐助

SQL 问题求解决

0
悬赏园豆:200 [已解决问题] 解决于 2014-07-25 10:03

求一条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   

      

悠悠思丶的主页 悠悠思丶 | 初学一级 | 园豆:189
提问于:2014-07-24 21:23
< >
分享
最佳答案
0

必须要一句sql???

收获园豆:200
幻天芒 | 高人七级 |园豆:37207 | 2014-07-25 00:01
--拼数据
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)

 

幻天芒 | 园豆:37207 (高人七级) | 2014-07-25 00:52

@幻天芒: 结果如下:

类型    薪酬类型    城市    城市    数量    城市    数量    城市    数量
KS01    KS01    1    BAS    100    CAR    1000    NET    10000
KS01    KS01    2    BAS    2    CAR    200    NET    2000
幻天芒 | 园豆:37207 (高人七级) | 2014-07-25 00:52

@幻天芒: 

谢谢大哥,但是第二查询后,

消息 2714,级别 16,状态 6,第 2 行
数据库中已存在名为 '#e' 的对象。

应该怎么清除临时表呢

悠悠思丶 | 园豆:189 (初学一级) | 2014-07-25 09:43

@悠悠思丶: drop table #e,这样就能删除临时表;

幻天芒 | 园豆:37207 (高人七级) | 2014-07-25 09:48

@幻天芒: 

谢谢老兄,搞定了,一会儿结贴

悠悠思丶 | 园豆:189 (初学一级) | 2014-07-25 09:51

@悠悠思丶: 这个我一般都在C#代码中搞定,然后在前台拼接。

幻天芒 | 园豆:37207 (高人七级) | 2014-07-25 09:58

 老兄格式还是有点儿不对,  查出来是这种各种是不对的,红色框起来要在一行内显 city_level可以不显示示,  @幻天芒: 

悠悠思丶 | 园豆:189 (初学一级) | 2014-07-25 16:51

@悠悠思丶: 不要是按照城市分组么???

幻天芒 | 园豆:37207 (高人七级) | 2014-07-25 18:13

@幻天芒: 嗯,是按城市的, 城市下有多种BAS CAR NET W01 W02 W03 等类型。这张是子表

 

主表有job_type  wage_level 关联这个子表 ,一行要列出5类或更多城市

悠悠思丶 | 园豆:189 (初学一级) | 2014-07-26 10:40

@悠悠思丶: @幻天芒: 

悠悠思丶 | 园豆:189 (初学一级) | 2014-07-26 10:44

@悠悠思丶: 我看不到图的,防火墙~

幻天芒 | 园豆:37207 (高人七级) | 2014-07-26 12:46

@幻天芒:  能加qq吗 124066483  初学者,复杂sql不太会

悠悠思丶 | 园豆:189 (初学一级) | 2014-07-26 13:30

@悠悠思丶: 我Q:one zero two eight double three double two seven three~

幻天芒 | 园豆:37207 (高人七级) | 2014-07-26 13:44

@幻天芒:  兄弟,我加了你qq,是叫幻精灵嘛, 在麻烦你15分钟咯,我在送你100豆 好不,,撒

悠悠思丶 | 园豆:189 (初学一级) | 2014-07-28 11:47

@悠悠思丶: 上班时间没QQ,只有晚上才能看的呢。

幻天芒 | 园豆:37207 (高人七级) | 2014-07-28 12:39

@幻天芒:  嗯啊,我已经搞定那些了,就您之前提供的答案,我想改改列显示,只显示 数量 就行了,你现在方便吗,我急用

悠悠思丶 | 园豆:189 (初学一级) | 2014-07-28 15:15

@悠悠思丶: 额,QQ肯定是没法的,你可以贴下你要的显示效果~

幻天芒 | 园豆:37207 (高人七级) | 2014-07-28 16:28

@幻天芒:  就是你上面发给我看的格式, 不过只需要数量就行了,其他字段都不要

悠悠思丶 | 园豆:189 (初学一级) | 2014-07-28 16:29

@悠悠思丶: 那你需要修改“生成动态列”的那段代码,让列只处理数量。

幻天芒 | 园豆:37207 (高人七级) | 2014-07-28 16:34

@幻天芒:  我改了几次都不太会,所以你帮下我喽,谢谢啦

悠悠思丶 | 园豆:189 (初学一级) | 2014-07-28 16:39

@悠悠思丶: 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';

应该是这样改,你试试呢~

幻天芒 | 园豆:37207 (高人七级) | 2014-07-28 16:59

@幻天芒:   嗯,谢谢,麻烦你了,学习了。

悠悠思丶 | 园豆:189 (初学一级) | 2014-07-28 17:01

@悠悠思丶: :)

幻天芒 | 园豆:37207 (高人七级) | 2014-07-28 17:14
其他回答(3)
0

 

查找的数据个数怎么跟字段个数不对啊?

查询的结果是不是这样的:

类型       薪酬类型          城市        BAS             CAR              NET

KS01       KS01             1          100.00       1000.00         10000.00

KS01       KS01             2          2.00            200.00          2000.00

 

会飞的金鱼 | 园豆:881 (小虾三级) | 2014-07-24 21:48

如果结果是上面的那样可以试一下:

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'

支持(0) 反对(0) 会飞的金鱼 | 园豆:881 (小虾三级) | 2014-07-24 22:31
0

麻烦的转换,你可以尝试下用临时表来处理,更清晰

刘志勇 | 园豆:261 (菜鸟二级) | 2014-07-25 08:40
0

select distinct 类型,薪酬类型,城市, (SELECT 城市类型+' '+数量 + ' ' FROM ks where 城市=a.[城市] FOR XML PATH('')) as 城市类型_数量 from KS a

 

Yu | 园豆:12990 (专家六级) | 2014-07-25 09:21

消息 8114,级别 16,状态 5,第 1 行
从数据类型 varchar 转换为 numeric 时出错。

 

      

支持(0) 反对(0) 悠悠思丶 | 园豆:189 (初学一级) | 2014-07-25 09:27

@悠悠思丶: 

 

select distinct 类型,薪酬类型,城市, (SELECT 城市类型+' '+cast(数量 as varchar(50))+ ' ' FROM ks where 城市=a.[城市] FOR XML PATH('')) as 城市类型_数量 from KS a

支持(0) 反对(0) Yu | 园豆:12990 (专家六级) | 2014-07-25 09:29

 城市数量能分开吗, 数据类型没问题,

支持(0) 反对(0) 悠悠思丶 | 园豆:189 (初学一级) | 2014-07-25 09:29

@悠悠思丶: 不明白 你想要的格式

支持(0) 反对(0) Yu | 园豆:12990 (专家六级) | 2014-07-25 09:30

@Yu:

 

要这样的?

支持(0) 反对(0) Yu | 园豆:12990 (专家六级) | 2014-07-25 09:33

@Yu:      

类型    薪酬类型    城市    类型  数量    类型     数量     类型    数量
KS01    KS01        1    BAS    100    CAR    1000    NET    10000
KS01    KS01        2     BAS    2       CAR     200     NET    2000

支持(0) 反对(0) 悠悠思丶 | 园豆:189 (初学一级) | 2014-07-25 09:35

@悠悠思丶: @幻天芒: 

谢谢老兄,搞定了,一会儿结贴

支持(0) 反对(0) 悠悠思丶 | 园豆:189 (初学一级) | 2014-07-25 09:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册