2016-05-11 3 views
0

Я пытаюсь подсчитать всех сотрудников, которые были запланированы только для показа на спутнике/на солнце, но фактически появились в другие дни, кроме сидения/солнца. Я пытаюсь сгруппировать этот счет by contractor_firm, но я получаю сообщение об ошибке в моем случае, говоря, что функции окна не разрешены.Группа в заявлении дела

count(case 
      when 
      TO_CHAR(emp_expected_date , 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') IN ('SAT', 'SUN') 
      and TO_CHAR(emp_actual_date , 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') 
      NOT IN ('SAT', 'SUN') THEN emp_id OVER (PARTITION BY contractor) ELSE NULL end) 
      AS contractor_non_compliance 
+1

Почему «НАВЕРХ»? – dnoeth

+0

без лишнего будет не просто дать мне общий счет. Мне нужно сгруппировать его подрядчиком? – Kiran

+0

Ну, вы написали *, пытаясь сгруппировать этот счет by contractor_firm *, это переводится как 'GROUP BY contractor' – dnoeth

ответ

0

Часть до OVER должна быть совокупностью, которая не так в запросе (вы агрегирование целого выражения). Таким образом, это недопустимый SQL.

Может быть, вы хотите сделать что-то вроде этого:

count(case when ... then 1 end) OVER (PARTITION BY contractor) 
+0

Не могли бы вы дать некоторую обратную ссылку на ответы? – trincot

0

делать ли это, что вы хотите?

sum(case when TO_CHAR(emp_expected_date , 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') IN ('SAT', 'SUN') and 
       TO_CHAR(emp_actual_date , 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') NOT IN ('SAT', 'SUN') 
     then 1 else 0 
    end) as contractor_non_compliance 

Если вы хотите, чтобы кол-сотрудников, а не инцидентов, а затем использовать count(distinct):

count(distinct case when TO_CHAR(emp_expected_date , 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') IN ('SAT', 'SUN') and 
         TO_CHAR(emp_actual_date , 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') NOT IN ('SAT', 'SUN') 
        then emp_id 
     end) as contractor_non_compliance 
0

Там, вероятно, много более эффективных способов для достижения этой цели, но вот один, который должен быть близко к работе, не зная точную структуру таблицы:

SELECT count(emp_id), contractor_firm 
FROM your_table 
WHERE emp_id in (
    SELECT emp_id 
    FROM your_table 
    WHERE TO_CHAR(emp_expected_date,'DY','NLS_DATE_LANGUAGE=ENGLISH') in ('SAT','SUN') 
    AND TO_CHAR(emp_expected_date,'DY','NLS_DATE_LANGUAGE=ENGLISH') not in ('MON','TUES','WEDS','THURS','FRI') 
    AND TO_CHAR(emp_actual_date,'DY','NLS_DATE_LANGUAGE=ENGLISH') in ('MON','TUES','WEDS','THURS','FRI') 
) 
GROUP BY contractor_firm 

Это будет COUNT() только emp_ids, которые должны были работать на либо «Сб», либо «Не», а не в будние дни, а затем работали в один из будних дней. Я подчеркиваю либо, потому что они не обязательно должны были быть запланированы как на «Сб», так и на «Солнце». Я считаю, что это соответствует вашим требованиям.

Смежные вопросы