【问题标题】:Group within case statement在案例陈述中分组
【发布时间】:2016-05-11 18:44:28
【问题描述】:

我正在尝试计算所有计划仅在周六/周日出现但实际上在周六/周日以外的其他日子出现的员工。 我正在尝试按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

【问题讨论】:

  • 没有结束不会只是给我一个总体计数。我需要按承包商分组吗?
  • 好吧,你写的试图按contractor_firm 对这个计数进行分组,这转换为GROUP BY contractor

标签: sql count case aggregate


【解决方案1】:

OVER 之前的部分必须是聚合,而在您的查询中不是这种情况(您正在聚合整个表达式)。所以这是无效的 SQL。

也许你想做这样的事情:

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

【讨论】:

  • 您能否就给出的答案提供一些反馈?
【解决方案2】:

这是你想要的吗?

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

【讨论】:

    【解决方案3】:

    可能有很多更好的方法可以实现这一点,但在不知道您的确切表结构的情况下,这里有一个应该接近工作的方法:

    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,而不是任何工作日,然后最终在某个工作日工作。我在这里强调任一,因为它们不一定要同时安排在“周六”和“周日” - 我相信这符合您的要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2010-10-30
      • 2016-05-13
      • 2016-02-21
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      相关资源
      最近更新 更多