1

我的表数据如下

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

如果 robin,josh & 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 以获得期望的结果。谢谢

4

1 回答 1

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 对它们进行汇总,以按日期计算专家数。这是由外部查询完成的。

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

于 2013-10-22T11:14:37.307 回答