首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请问一个动态生成列数的SQL~多谢

2012-01-26 
请教一个动态生成列数的SQL~谢谢createtabletb_car(CarIDvarchar(20)primarykey,--车号CarTypchar(10),--

请教一个动态生成列数的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 行受影响)

热点排行