请教一个动态生成列数的SQL~谢谢
create table tb_car (
CarID varchar(20) primary key, --车号
CarTyp char(10),--车型
EmpID int,--员工编号
DepID int)--部门编号
insert tb_car select '1 ', '别克 ',2,1
union all select '2 ', '别克 ',3,1
union all select '3 ', '凯越 ',2,1
union all select '4 ', '福特 ',4,2
union all select '5 ', '奔驰 ',5,3
union all select '6 ', '别克 ',2,1
我想统计 每个部门,每个员工每个车型的销售数量
比如:
部门 员工 别克 凯越 福特 奔驰 总计
1 2 2 1 0 0 3
1 3 1 0 0 0 1
2 4 0 0 1 0 1
3 5 0 0 0 1 1
如果可以的话,再加统计功能:
部门 员工 别克 凯越 福特 奔驰 总计
1 2 2 1 0 0 3
1 3 1 0 0 0 1
合计 3 1 0 0 4
2 4 0 0 1 0 1
合计 0 0 1 0 1
3 5 0 0 0 1 1
合计 0 0 0 1 1
总计 3 1 1 1 6
[解决办法]
declare @sql varchar(8000)
set @sql= ' '
select @sql=@sql+ ',sum(case cartyp when ' ' '+rtrim(cartyp)+ ' ' ' then 1 else 0 end) as ' ' '+rtrim(cartyp)+ ' ' ' ' from tb_car group by cartyp
set @sql= 'select depid,empid '+@sql+ ' from tb_car group by depid,empid '
exec(@sql)
[解决办法]
create table tb_car (
CarID varchar(20) primary key, --车号
CarTyp char(10),--车型
EmpID int,--员工编号
DepID int)--部门编号
insert tb_car select '1 ', '别克 ',2,1
union all select '2 ', '别克 ',3,1
union all select '3 ', '凯越 ',2,1
union all select '4 ', '福特 ',4,2
union all select '5 ', '奔驰 ',5,3
union all select '6 ', '别克 ',2,1
declare @sql varchar(8000)
set @sql= 'select depId,empid '
select @sql=@sql+ ', '+ ' sum (case when cartyp = ' ' '+cartyp+ ' ' ' then 1 else 0 end ) as '+ cartyp from
(select distinct cartyp from tb_car ) a
set @sql=@sql+ ', (select count(1) from tb_car where a.depId=depid and a.empid=empid) as 合计 '
set @sql=@sql + ' from tb_car a group by depId,empid '
exec(@sql)
depId empid 奔驰 别克 福特 凯越 合计
----------- ----------- ----------- ----------- ----------- ----------- -----------
1 2 0 2 0 1 3
1 3 0 1 0 0 1
2 4 0 0 1 0 1
3 5 1 0 0 0 1
[解决办法]
declare @sql varchar(8000)
set @sql= ' '
select @sql=@sql+ 'sum(case CarTyp when ' ' '+CarTyp+ ' ' ' then 1 else 0 end) '+CarTyp+ ', ' from tb_car group by CarTyp
exec( 'select depid 部门,case when grouping(depid)=1 then ' '总计 ' ' when grouping(empid)=1 then ' '合计 ' ' else cast(empid as varchar) end 员工, '+@sql+ 'count(1) 总计 from tb_car group by depid,empid with rollup ')
[解决办法]
create table tb_car (
CarID varchar(20) primary key, --车号
CarTyp char(10),--车型
EmpID int,--员工编号
DepID int)--部门编号
insert tb_car select '1 ', '别克 ',2,1
union all select '2 ', '别克 ',3,1
union all select '3 ', '凯越 ',2,1
union all select '4 ', '福特 ',4,2
union all select '5 ', '奔驰 ',5,3
union all select '6 ', '别克 ',2,1
declare @sql varchar(4000)
set @sql= 'select
[DepID]=case when grouping(empid)=1 then ' ' ' ' else rtrim(depid) end,
[empid]=case when grouping(empid)=1 and grouping(DepID)=1 then ' '总计 ' '
when grouping(empid)=1 then ' '合计 ' 'else rtrim(empid) end '
select @sql=@sql+ ',[ '+rtrim(CarTyp)+ ']=sum( case when CarTyp= '+quotename(CarTyp, ' ' ' ')+ ' then 1 else 0 end) '
from tb_car group by CarTyp
set @sql=@sql+ ',[合计]=count(*)
from tb_car group by DepID,empid with rollup '
--print @sql
exec(@sql)
DepID empid 奔驰 别克 福特 凯越 合计
------------ ------------ ----------- ----------- ----------- ----------- -----------
1 2 0 2 0 1 3
1 3 0 1 0 0 1
合计 0 3 0 1 4
2 4 0 0 1 0 1
合计 0 0 1 0 1
3 5 1 0 0 0 1
合计 1 0 0 0 1
总计 1 3 1 1 6
(8 行受影响)