在一周内获得所有Distinct的总和

时间:2012-10-18 15:21:30

标签: sql sql-server-2005

我想知道我对这个查询到底有多清楚。我想得到在特定周内工作的所有不同RepID的计数。这是在SQL Server 2005中。谢谢!!

此查询为我提供了整周的独特RepID。如果他在2个不同日期有记录,我想计算两次RepID,但即使他在任何一个日子里有超过1个记录,我只计算一次。我希望我很清楚。对不起我以前不清楚!谢谢!

Select count(distinct(RepID)) as SalesPeople from DailyInfo
where Date > DATEADD(dd, -(DATEPART(dw, @Date)-1), @Date) 
     and Date < DATEADD(dd, 7-(DATEPART(dw, @Date)), @Date)

5 个答案:

答案 0 :(得分:2)

您可以制作RepID +日期的唯一组合,使其独一无二(SQLFiddle):

  SELECT COUNT(distinct RIGHT(DateDiff(d,0,Date),10)
                       +RIGHT(RepID,10)) as SalesPeople
    FROM DailyInfo
   WHERE Date > DATEADD(dd, -(DATEPART(dw, @Date)-1), @Date)
     AND Date < DATEADD(dd, 7-(DATEPART(dw, @Date)), @Date);

我假设DailyInfo.Date 可以包含时间信息。您可以仅针对DateDiff(d,0,Date)交换上面的Date。同样,下面的CAST(DateDiff(d,0,Date) as datetime)可以只是'Date。

如果您需要查看每天的明细,请在下面查询。

  SELECT CAST(DateDiff(d,0,Date) as datetime) TheDay,
         COUNT(distinct RepID) as SalesPeople
    FROM DailyInfo
   WHERE Date > DATEADD(dd, -(DATEPART(dw, @Date)-1), @Date)
     AND Date < DATEADD(dd, 7-(DATEPART(dw, @Date)), @Date)
GROUP BY CAST(DateDiff(d,0,Date) as datetime) -- by day
ORDER BY TheDay

答案 1 :(得分:1)

让我通过建议你应该如何思考这个问题来回答这个问题。您正在寻找每天的代表数量。因此,您的查询应该具有此级别的摘要(子查询)。然后,您可以计算每周的天数。

假设您的日期没有任何时间组件,您可以使用以下内容:

select count(*)
from (select RepId, date as thedate, count(*) as NumOnDay
      from DailyInfo
      group by RepId, date
      where Date > DATEADD(dd, -(DATEPART(dw, @Date)-1), @Date) 
           and Date < DATEADD(dd, 7-(DATEPART(dw, @Date)), @Date)
     ) rd

或者,您可以计算代表在一周内工作的天数,然后将其添加:

select sum(numdates)
from (select RepId, count(distinct date) as numdates
      from DailyInfo
      group by RepId 
      where Date > DATEADD(dd, -(DATEPART(dw, @Date)-1), @Date) 
           and Date < DATEADD(dd, 7-(DATEPART(dw, @Date)), @Date)
     ) rd

如果您的date字段包含时间组件,则需要删除时间组件才能使其生效。或者使用诸如day(date)之类的技巧,因为day函数将为一周中的每个日期返回不同的值。在SQL Server的更高版本中,如果原始日期是datetime,则可以cast(date as date)

答案 2 :(得分:0)

Select count(1)
from DailyInfo
group by convert(varchar(10),[date], 120) 
where [put your condition here]

答案 3 :(得分:0)

你可以使用CTE,但可能会过度杀戮。并且在CTE当天有小组,你需要做的是总数的总和。

WITH cte ([day], total) as
(
    Select DATENAME(DW,[Date]), count(distinct(RepID)) as SalesPeople from DailyInfo
    where [Date] > DATEADD(dd, -(DATEPART(dw, @Date)-1), @Date) and [Date] < DATEADD(dd, 7-(DATEPART(dw, @Date)), @Date)
    GROUP BY DATENAME(DW,[Date])
)
select SUM(total) FROM cte;

答案 4 :(得分:0)

要做我认为你想要的事情,你需要按天分组,过滤一周,然后对结果做一个明确的分析:

 Select Distinct(RepID) 
 From (Select RepID
       Group By DateDiff(day, 0, Date)
       From DailyInfo
       Where Date > DateAdd(dd, -(DATEPART(dw, @Date)-1), @Date) 
         And Date < DateAdd(dd, 7-(DATEPART(dw, @Date)), @Date)