我有一个俱乐部成员名单以及他们参加俱乐部的日期时间。他们可以在一天内多次参加俱乐部。我需要知道每个成员在一段时间内参加了多少个星期日(无论在一个星期天内多少次)。我有一张表格,列出每个出席人数,由会员编号和出勤日期时间组成。
例如,在这个例子中,13/1和20/1是星期日
MEMBER ATTENDANCE
12345 13/1/13 09:00
12345 13/1/13 15:00
12345 14/1/13 08:00
56789 13/1/13 10:00
56789 13/1/13 15:00
56789 13/1/13 21:00
56789 14/1/13 10:00
56789 20/1/13 09:00
24680 14/1/13 08:00
24680 15/1/13 07:00
理想情况下,我希望看到这个回复:
MEMBER # OF SUNDAYS
12345 1
56789 2
24680 0
答案 0 :(得分:2)
我认为你需要这个:
select Member,
count(distinct dateadd(day, datediff(day, 0, Attendance), 0)) as NumberOfSundays
from t
where datepart(dw, Attendance) = 6
group by Member ;
复杂的计数确实在做:
count(distinct cast(Attendance as date))
但SQL Server 2005不支持date
数据类型。
编辑:
您可以使用datepart(dw, Attendance) = 6
。
datename(dw, Attendance) = 'Sunday'
答案 1 :(得分:0)
试试这个
SELECT MEMBER,
SUM(CASE DATENAME(dw,ATTENDANCE) WHEN 'Sunday' THEN 1 ELSE 0 END) As [# OF SUNDAYS]
FROM MemberTable
WHERE ATTENDANCE between [YourStartDateAndTime] AND [YourEndDateAndTime] -- replace [YourStartDateAndTime] AND [YourEndDateAndTime] with your value or variable
GROUP BY MEMBER
答案 2 :(得分:0)
看一下这个例子,它也可以起作用:
select Member
, count( case when datepart( dw, Attendance ) = 6 then 1 else 0 end ) NumberOfSundays
from YourTable
where Attendance between '2013-01-13' and '2013-01-20'
group by Member
避免在where
子句上使用“修改字段原始值”的函数。通过这样做,SQL Server将使用表扫描创建执行计划,忽略任何可以加快查询速度的索引!