在Microsoft SQL Server 2008中,如何将一张表的某列字段的值转换为列名称?

如下表:部门客户费用名称金额Aa手机费10Aa办公费11Aa公交费9Ab手机费10Ab办公费10Ac公交费10Bd手机费10Bd办公费10Be公交费10Bf手机费10Bf... 如下表:
部门 客户 费用名称 金额
A a 手机费 10
A a 办公费 11
A a 公交费 9
A b 手机费 10
A b 办公费 10
A c 公交费 10
B d 手机费 10
B d 办公费 10
B e 公交费 10
B f 手机费 10
B f 办公费 10
B f 公交费 10
将上表转换成如下格式:
部门 客户 手机费 办公费 公交费
A a 10 11 9
A b 10 10
A c 10
B d 10 10
B e 10
B f 10 10 10
那位高手帮忙解决下,不胜感激!
展开
 我来答
badkano
2013-11-20 · 知道合伙人体育行家
badkano
知道合伙人体育行家
采纳数:144776 获赞数:885368
团长

向TA提问 私信TA
展开全部

创建表数据

create table test
(部门 varchar(10),
客户 varchar(10),
费用名称 varchar(10),
金额 int)

insert into test values ('A','a','手机费',10)
insert into test values ('A','a','办公费',11)
insert into test values ('A','a','公交费',9)
insert into test values ('A','b','手机费',10)
insert into test values ('A','b','办公费',10)
insert into test values ('A','c','公交费',10)
insert into test values ('B','d','手机费',10)
insert into test values ('B','d','办公费',11)
insert into test values ('B','e','公交费',9)
insert into test values ('B','f','手机费',10)
insert into test values ('B','f','办公费',10)
insert into test values ('B','f','公交费',10)

 

运行

declare @sql varchar(4000)
set @sql = 'select [部门],[客户]'
select @sql = @sql + ',sum(isnull(case [费用名称] when '''+[费用名称]+''' then [金额] end,0)) as 
['+[费用名称]+']'
from (select distinct [费用名称] from [test]) as a
select @sql = @sql+' from [test] group by [部门],[客户]'
exec(@sql)

结果

 

说明,以上适用于sqlserver,这个适用于费用名称不确定的情况,如果你费用名称确定的话,可以这样

select 部门,客户,
sum(case when 费用名称='办公费' then 金额 else 0 end) 办公费,
sum(case when 费用名称='公交费' then 金额 else 0 end) 公交费,
sum(case when 费用名称='手机费' then 金额 else 0 end) 手机费
from test
group by 部门,客户

这个语句基本所有数据库适用

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式