4

我正在为 SQL Server 2012 中的应用程序构建查询。该查询应该从 SQL Server 的单个表中获取各种状态。

表的结构如下:

ProjectType | Team | ProjectStatus 
----------------------------------
 Proj1          B      Rec
 Proj1          B      Rec
 Proj1          B      Hold
 Proj2          B      Rec
 Proj3          A      Hold
 Proj4          C      Some

我想要的输出是:

ProjectType | Total | Team | Rec| Hold | Some |
-----------------------------------------------
  Proj1         3      B      2     1      0
  Proj2         1      B      1     0      0
  Proj3         1      A      0     1      0
  Proj4         1      C      0     0      1

我认为这是可能的,因为我知道它们将成为的所有状态:

所有状态都是

Rec, BA, DQ, P, Prev, PRed, PCom, 90, 90Rev, 90Red, 90Com, SS, SSRed, D, C

到目前为止我已经尝试过:

select 
    ProjectType, Team, count(ProjectStatus) 
from 
    sites 
where 
    (ProjectType is not null and ProjectType <> '') and Team <> '' 
group by 
    ProjectType, Team 


select 
    s.ProjectType, S.Team, S.ProjectType, C.cnt
from 
    Sites s
Inner Join 
    (Select ProjectType, Count(ProjectStatus) as cnt 
     from Sites 
     Where ProjectStatus = 'Rec' group By ProjectType) C on S.ProjectType = c.ProjectType

这是我想添加的地方

Inner Join ( Select ProjectType, Count(ProjectStatus) as cnt from Sites 
Where ProjectStatus='Rec' group By ProjectType) C 
on S.ProjectType = c.ProjectType

根据我所拥有的状态,以便单独计算它们......

编辑:但是输出是错误的,它为所有不同的项目计算了所有相同的项目类型(比如我有 10 个不同的项目),它显示所有相同的项目 10 次

有没有更好的方法 - 有人可以帮我完成吗?

4

1 回答 1

4

根据您的问题,您似乎有多个状态(都是已知的)并希望按状态显示计数 - 将状态放在顶部。有很多方法可以使用 PIVOT 来做到这一点,但我现在不在一台拥有我的开发资源的计算机上,所以这就是我会这样做的方式(我的头脑 - 未经测试)。

select 
  ProjectType,
  count(*) as Total,
  Team,
  sum(case when ProjectStatus = 'Rec' then 1 else 0 end) as 'Rec',
  sum(case when ProjectStatus = 'Hold' then 1 else 0 end) as 'Hold',
  sum(case when ProjectStatus = 'Some' then 1 else 0 end) as 'Some'
from
  sites
where
  ProjectStatus in ('Rec', 'Hold', 'Some')
group by
  ProjectType,
  Team

SQLFiddle

于 2013-07-25T14:37:25.297 回答