2013-10-22 55 views
1

我的表中的数据如下如何by子句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

如果罗宾,乔什&萨姆在完成当天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有希望的结果。谢谢

回答

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而不是distinct,以防我稍后需要聚合函数,但这就是我。如果您愿意,可以使用Select Distinct。

+0

我们可以在group by子句中指定select语句吗?如果这是不可能的,那么请帮助我理解原因。谢谢 – Thomas

+0

不知道我完全理解这个问题,但让我修改答案,看看它是否有帮助。查看修改。 – asantaballa