4

我编了一个奇怪的例子来说明我想要做什么(这有点愚蠢,但请耐心等待):

考虑下表:

雇员
员工表数据

已婚认证宗教只是布尔字段(在 Oracle 的情况下,它们的类型为 NUMBER(1,0))。

我需要提出 SQL 来显示每个hire_year、已婚、持证和宗教雇员在以下工资类别中的数量:

  • 一个 SALARY > 2000
  • SALARY BETWEEN 1000 AND 2000
  • C SALARY < 1000

基于上面的数据集,这是我期望得到的:

预期结果

到目前为止,我只提出了以下 SQL:

SELECT
COUNT(CASE WHEN married = 1 THEN 1 END) as MARRIED,
COUNT(CASE WHEN certified = 1 THEN 1 END) as certified,
COUNT(CASE WHEN religious = 1 THEN 1 END) as religious,
hire_year
FROM employees
GROUP BY hire_year;

执行此 SQL 的结果是:

实际结果

这几乎是我所需要的,但我还需要根据工资范围将这些计数器进一步细分。

我想一些分析函数,根据一些 SQL 表达式将组划分为桶会有所帮助,但我不知道是哪一个。我尝试使用NTILE,但它需要一个正常量作为参数,而不是 SQL 表达式(例如SALARY BETWEEN X and Y)。

4

1 回答 1

7

不,不需要分析函数;无论如何,它们很难在同一个查询中作为聚合函数。

您要case再次查找该语句,只需将其放入 GROUP BY 中。

select hire_year
     , sum(married) as married
     , sum(certified) as certified
     , sum(religious) as religious
     , case when salary > 2000 then 'A'
            when salary >= 1000 then 'B'
            else 'C' end as salary_class
  from employees
 group by hire_year
     , case when salary > 2000 then 'A'
            when salary >= 1000 then 'B'
            else 'C' end

请注意,我已将您更改count(case when...)sum(). 这是因为您使用的是布尔值 1/0,所以这将以相同的方式工作,但它更清洁。

出于同样的原因,我between在你的工资计算中忽略了你;没有特别需要,好像工资大于2000第一个CASE已经完成了。

于 2012-09-08T15:02:30.290 回答