行转列 - 多表

--测试环境建立
if object_id('tableA') is not null drop table tableA
go
create table tableA(Mon int,Dept int,yj int)
insert tableA
select 1 ,1 ,10 union all
select 1 ,2 ,12 union all
select 2 ,1 ,10 union all
select 3 ,3 ,13 union all
select 2 ,2 ,24 union all
select 3 ,1 ,12
go
if object_id('tableB') is not null drop table tableB
go
create table tableB(Dept int,DeptName varchar(10))
insert tableB
select 1, '部门1' union all
select 2, '部门2' union all
select 3, '部门3'

--静态

select Dept ,
max(case Mon when 1 then yj else null end) [一月],
max(case Mon when 2 then yj else null end) [二月],
max(case Mon when 3 then yj else null end) [三月]
from tableA
group by Dept
--结果
/*
Dept 一月 二月 三月
----------- ----------- ----------- -----------
1 10 10 12
2 12 24 NULL
3 NULL NULL 13

(所影响的行数为 3 行)*/


--动态
declare @sql varchar(8000)
set @sql='select b.DeptName '
select @sql=@sql+',max(case a.Mon when '+ltrim(Mon)+' then a.yj else null end) ['+ltrim(Mon)+'月]'
from(select distinct Mon from tableA) t
set @sql=@sql+' from tableA a join tableB b on a.Dept=b.Dept group by b.DeptName'
exec(@sql)
--结果
/*
DeptName 1月 2月 3月
---------- ----------- ----------- -----------
部门1 10 10 12
部门2 12 24 NULL
部门3 NULL NULL 13

(所影响的行数为 3 行)

警告: 聚合或其他 SET 操作消除了空值。
*/

--动态 补全日期
declare @sql varchar(8000)
set @sql='select b.DeptName '
select @sql=@sql+',max(case a.Mon when '+ltrim(Mon)+' then a.yj else null end) ['+ltrim(Mon)+'月]'
from(
select 1 Mon union
select 2 union
select 3 union
select 4 union
select 5 union
select 6 union
select 7 union
select 8 union
select 9 union
select 10 union
select 11 union
select 12
) t
set @sql=@sql+' from tableA a join tableB b on a.Dept=b.Dept group by b.DeptName'
exec(@sql)

--结果
/*
DeptName 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
部门1 10 10 12 NULL NULL NULL NULL NULL NULL NULL NULL NULL
部门2 12 24 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
部门3 NULL NULL 13 NULL NULL NULL NULL NULL NULL NULL NULL NULL

(所影响的行数为 3 行)

警告: 聚合或其他 SET 操作消除了空值。

*/

你可能感兴趣的:(行转列)