2013-07-17 4 views
1
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) 

Этот запрос будет выглядеть через назначение времени начала и не рассчитывать пятницы наших Docs работают только половину дня по пятницам. Мне сказали, что мы хотим, чтобы их сосчитать, но только как в полдня (первый раз мне сказали, чтобы их исключить).SQL Server 2008 Count (Distinct СЛУЧАЙ?

Может кто-нибудь, пожалуйста, помогите мне с заявлением о делах, которое будет считать пятницы, у которых нет встречи после 12 минут, как полдня? придется поместиться в ScheduleDays=COUNT(DISTINCT(CAST(datediff(d,0,a.ApptStart) as datetime))). Возможно, мы можем поставить пятницу и после 12 фильтров там, а не в предложение where, если мы будем использовать случай в любом случае. ScheduleDays=COUNT(DISTINCT CASE WHEN etc. Я очень ценю помощь.

+1

Опубликованная запрос возвращает количество дней в текущем месяце, когда врач имеет запланированную встречу, которая не в пятницу, а во второй половине дня , Никаких назначений в пятницу не засчитывается, и никакие утренние встречи не засчитываются. Вы запрашиваете запрос, который подсчитывает тот же прием, но только до полудня, если назначение назначено на пятницу и в любое время в другие дни? –

+0

Хм, как вы можете сказать, я новичок в этом материале SQL. Я хочу, чтобы он засчитывал все дни, которые назначили встречу. Если в пятницу утром встречаются только по назначению (cuttoff в полдень), мы считаем это полдня. Идея здесь состоит в том, чтобы вернуть количество дней, в которые doc имеет встречи и считая пятницы как полдня. Мы собираемся использовать это, чтобы установить для них ориентиры. – user2588088

+0

Можете ли вы задать свой вопрос лучше, более описательно? Это похоже на вопрос, который может быть полезен другим пользователям, так что было бы позором, если они не будут найдены ими из-за названия :-) – Josien

ответ

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.

EDIT:

С час проверки:

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 
+0

Ха-ха-ха-ха! Это имеет большой смысл. Если бы я хотел добавить чек на время, я бы добавил его после = «Пятница» _________ и т. Д. Итак, и DATEPART (час, a.ApptStart)> 12. Это работает как Java правильно? Где и применяется как к «Пятнице», так и к «12»? – user2588088

+0

Гордон благодарит вас за вашу помощь! – user2588088