gpt4 book ai didi

sql - 对组的子组应用 COUNT 函数

转载 作者:行者123 更新时间:2023-12-04 23:59:32 24 4
gpt4 key购买 nike

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

考虑下表:

员工
Employees table data

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

我需要想出一个 SQL 来显示每个雇佣年、已婚员工、认证员工和宗教员工在以下工资类别中的数量:

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

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

    Expected result

    到目前为止,我只提出了以下 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的结果是:

    Actual result

    这几乎是我所需要的,但我还需要根据薪水范围将这些计数器进一步分为几组。

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

    最佳答案

    不,不需要解析函数;无论如何,它们很难在与聚合函数相同的查询中使用。

    您正在寻找 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() .这是因为您使用的是 bool 值 1/0,所以这将以相同的方式工作,但它更干净。

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

    关于sql - 对组的子组应用 COUNT 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12331800/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com