我正在努力计算所有预定只出现在坐/太阳上的员工,但除了坐/太阳之外其他日子实际上出现了。 我试图通过contractor_firm对这个计数进行分组,但是在我的案例中我发错误说窗口函数不被允许。
{{1}}
答案 0 :(得分:0)
OVER
之前的部分必须是聚合,在查询中不是这种情况(您正在聚合整个表达式)。所以这是无效的SQL。
也许你想做这样的事情:
count(case when ... then 1 end) OVER (PARTITION BY contractor)
答案 1 :(得分: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
答案 2 :(得分: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
计划在上工作'星期六'或'太阳',而不是任何工作日,然后最终工作平日。我在这里强调 ,因为它们不一定要在'星期六'和'太阳'上安排 - 我相信这符合你的要求。