SQL Server 2008 Count(Distinct CASE?

时间:2013-07-17 14:08:33

标签: sql sql-server-2008

SELECT     
    ScheduleDays = COUNT(DISTINCT(CAST(datediff(d, 0, a.ApptStart) AS datetime)))
FROM 
    Appointments a
WHERE   
    ApptKind = 1 AND 
    --filter on current month
    a.ApptStart >= ISNULL(DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0),'1/1/1900')   AND
    a.ApptStart < ISNULL(DATEADD(month, DATEDIFF(month, 0, GETDATE())+1, 0),'1/1/3000')AND
    --filter all days that aren't Friday, and then give you all Fridays that have an hour > 12.
    DATENAME(weekday, a.ApptStart) <> 'Friday' and DATEPART(hour, a.ApptStart) > 12 AND
    --Filter on doctor
    a.ResourceID in (201)

此查询将查看约会开始时间而不计算星期五,因为我们的文档仅在星期五工作半天。有人告诉我,我们确实想要计算它们,但只有半天(第一次我被告知排除它们大声笑)。

有人可以帮我一个案例陈述,这个陈述会计算在周六12点之后没有约会的星期五半天吗?我相信它必须进入ScheduleDays=COUNT(DISTINCT(CAST(datediff(d,0,a.ApptStart) as datetime)))。也许我们可以把星期五和之后的12个过滤器放在那里,而不是在where子句中,如果我们要使用案例的话。 ScheduleDays=COUNT(DISTINCT CASE WHEN etc。我非常感谢你的帮助。

1 个答案:

答案 0 :(得分:3)

你无法使用count计算一半的东西,所以这不是可行的方法。但是,你可以用算术做到这一点。我想是这样的:

select (count(distinct (case when DATENAME(weekday, a.ApptStart) <> 'Friday'
                             then cast(a.apptstart as date)
                        end)
             ) +
        0.5 * count(distinct (case when DATENAME(weekday, a.ApptStart) = 'Friday'
                                   then cast(a.apptstart as date)
                              end)
                   )
       ) as ScheduleDays

如果文档仅在周五工作半天,我认为您不需要检查约会时间。当然,如果您愿意,可以将其添加到第二个count

请注意,为了计算天数,我使用了将datetime转换为date的更简单的语法。

编辑:

小时检查:

select (count(distinct (case when DATENAME(weekday, a.ApptStart) <> 'Friday'
                             then cast(a.apptstart as date)
                        end)
             ) +
        0.5 * count(distinct (case when DATENAME(weekday, a.ApptStart) = 'Friday' and  DATEPART(hour, a.ApptStart) <= 12 
                                   then cast(a.apptstart as date)
                              end)
                   )
       ) as ScheduleDays