方法/步骤
首先我们建立一张表,名为RToC,各个字段的设计如下图,分别是name,course,score,表示姓名,成绩与分数,如图所示。
我们往表中加入数据,分别添加小明与小花的语文和数学成绩,如图所示。
接下来,我们要进行行列转换,列应该是name,语文,数学。我们首先要考虑是如何得到列名,我们可以通过分组得到课程名称。如图所示,我们通过分组语句,从查询结果我们可以看出课程名的拼接字符串。
接下来,关键的行转列的函数pivot出场了,通过这个函数我们把分数填充到转换的列语文、数学的列值。
我们运行后,可以得到行转列的结果,如下图所示。
通过以上几个步骤,我们就可以轻松的实现行列转换了。同样,我们如果要把列转换成行, 应该怎么做呢?同样我们可以采用unpivot函数轻松实现。
创建表数据
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 部门,客户
这个语句基本所有数据库适用
什么数据库?
我现在只能给你显示成这样,是不是不太满足?就是那汇总不好汇
不过我借助了一个视图和一个declare动态执行的,没把你的内容写死
-----------搞定了---------
先创建视图
create view v_e as
select c.custom,a.name proname,sum(d.account) as account
from a,b,c,d where a.id=b.aid and c.id=d.bid and d.mid=b.id
group by c.custom,a.name
union all
select c.custom,b.name proname,sum(d.account) as account
from a,b,c,d where a.id=b.aid and c.id=d.bid and d.mid=b.id
group by c.custom,b.name
然后
declare @sql varchar(4000)
set @sql = 'select [custom]'
select @sql = @sql + ',sum(isnull(case [proname] when '''+[name]+''' then [account] end,0)) as
['+[name]+']'
from (select top 1000 name from
(select name,'t1' t,id from a
union all
select name,'t2' t,aid id from b) c
order by id,t) as a
select @sql = @sql+' from [v_e] group by [custom]'
exec(@sql)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)