日期:2014-05-19  浏览次数:20539 次

高送分求一SQL语句,出结果即结帖
有一张表TempTable,表结构及内容如下
_______________________________________
  ID       FileName     FileType     FileStatus
  1         登记表             1 1
  2         登记表         2 2
  3         监督方案     1 2
  4         安全培训记录 3 1
  5         安全培训记录 1 2
  6         专项方案1 2 2
  7         专项方案2 2 2
  8         专项方案2 3 2
________________________________________
说明:FileType的1表示阶段1,2表示阶段2,3表示阶段3
          FileStatus的1表示新建、2表示上报
要求得出每阶段的表格记录总数、新建数、上报数,
如下:
_________________________________
阶段           总数       新建数       上报数
_________________________________
阶段1           3             1                 2
阶段2           3             0                 3
阶段3           2             1                 1
__________________________________


------解决方案--------------------
select
'阶段 ' + FileType as 阶段 ,
count(*) AS 总数,
sum(case when FileStatus=1 then 1 else 0 end) as 新建数,
sum(case when FileStatus=2 then 1 else 0 end) as 上报数
from TempTable
group by '阶段 ' + FileType
------解决方案--------------------
if object_id( 'pubs..tb ') is not null
drop table tb
go

create table tb(ID int,FileName varchar(20),FileType int,FileStatus int)
insert into tb(ID,FileName,FileType,FileStatus) values( 1, '登记表 ' ,1, 1)
insert into tb(ID,FileName,FileType,FileStatus) values( 2, '登记表 ' ,2, 2)
insert into tb(ID,FileName,FileType,FileStatus) values( 3, '监督方案 ' ,1, 2)
insert into tb(ID,FileName,FileType,FileStatus) values( 4, '安全培训记录 ' ,3, 1)
insert into tb(ID,FileName,FileType,FileStatus) values( 5, '安全培训记录 ' ,1, 2)
insert into tb(ID,FileName,FileType,FileStatus) values( 6, '专项方案1 ' ,2, 2)
insert into tb(ID,FileName,FileType,FileStatus) values( 7, '专项方案2 ' ,2, 2)
insert into tb(ID,FileName,FileType,FileStatus) values( 8, '专项方案2 ' ,3, 2)
go

select a1.阶段 , a1.总数 , isnull(a2.新建数,0) 新建数 , isnull(a3.上报数 , 0) 上报数 from
(select '阶段 ' + cast(filetype as varchar) as '阶段 ', count(*) 总数 from tb group by filetype) a1
left join
(select '阶段 ' + cast(filetype as varchar) as '阶段 ' , count(*) 新建数 from tb where filestatus = 1 group by filetype) a2
on a1.阶段 = a2.阶段
left join
(select '阶段 ' + cast(filetype as varchar) as '阶段 ' , count(*) 上报数 from tb where filestatus = 2 group by filetype) a3
on a1.阶段 = a3.阶段

drop table tb
/*
阶段 总数 新建数 上报数
---------------------------------- ----------- ----------- -----------
阶段1 3 1 2
阶段2 3 0 3
阶段3