我想知道我对这个查询到底有多清楚。我想得到在特定周内工作的所有不同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)
答案 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)