如何在group by子句sql server 2005中使用子查询

时间:2013-10-22 10:58:58

标签: sql-server-2005

我的表格数据如下

FinishDate                  SpecialistName  jobstate
-----------------------     --------------- ---------
2012-10-01 00:00:00.000     Josh            FINISHED
2012-10-01 00:00:00.000     Josh            FINISHED
2012-10-01 00:00:00.000     Sam             FINISHED
2012-10-01 00:00:00.000     Robin           FINISHED
2012-10-01 00:00:00.000     Robin           FINISHED
2012-10-01 00:00:00.000     Joy             FINISHED
2012-10-01 00:00:00.000     Joy             INCOMMING
2012-10-02 00:00:00.000     Joy             FINISHED

我的查询如下

select Count(*) [Count] from employee
where convert(varchar,FinishDate,112)>='20121001' 
and convert(varchar,FinishDate,112) <='20121001'  
and JobState='FINISHED'
group by SpecialistName

如果特定专家在同一天完成多个工作,那么我想显示1

如果罗宾,乔什&amp; Sam在同一天完成了10个工作,然后将在当天显示3个工作

然后输出就像

FinishDate                  Count
-----------------------     ------
2012-10-01 00:00:00.000     3     
2012-10-02 00:00:00.000     5
2012-10-03 00:00:00.000     15

所以请指导我如何自定义我的sql以获得欲望的结果。感谢

1 个答案:

答案 0 :(得分:2)

尝试这些方面的东西。语法可能不完美(做“徒手”)

Select 
  TheDate
, Count(*) [Count]
From
(
    select 
      convert(varchar,FinishDate,112) TheDate
    , SpecialistName
    from employee
    where convert(varchar,FinishDate,112)>='20121001' 
    and convert(varchar,FinishDate,112) <='20121001'  
    and JobState='FINISHED'
    group by 
      convert(varchar,FinishDate,112)
    , SpecialistName
) t1    
Group By 
  TheDate

它必须是两个选择,因为您想要的分组是不同的。如果您通过FinishDate和SpecialistName进行单一选择分组,那么您将得到的是这两者中不同的组合的计数。

你想要的是获得在日期中至少有一个条目的独特的SpecialistNames。区别是因为你关心他们有一个条目,但不管他们是否有1或3或17.这是由内部查询完成的。

然后您希望将这些不同的SpecialistName与相应的日期一起使用,并通过FinishDate对它们进行汇总,以按日期获取专家计数。这是由外部查询完成的。

你的评论的一部分提到了区别,你可以在内部查询中使用Select Distinct而不是Group By,因为我们不需要在那里进行计数。外部查询确实需要Group By,因为您需要计数。我自己的偏见是使用group by而不是以后我需要一个聚合函数,但那就是我。如果您愿意,可以使用Select Distinct。