【问题标题】:Error while using columns achieved by aggregation of window function in case statement在case语句中使用通过聚合窗口函数实现的列时出错
【发布时间】:2021-08-09 12:07:33
【问题描述】:

我正在学习 SQL 窗口函数作为解决 leet 代码平均工资、部门与公司的一部分,https://leetcode.com/problems/average-salary-departments-vs-company/

我已经使用窗口函数编写了一个查询

select left(pay_date,7) as month, department_id,
avg(amount) over (partition by left(pay_date,7), department_id) as dep_avg,
avg(amount) over(partition by left(pay_date,7)) as com_avg,
CASE 
    WHEN dep_avg = com_avg THEN 'same'
    else 'not same' end as comparision                               
from salary s
inner join employee e
on s.employee_id = e.employee_id

查询在没有case语句的情况下可以正常工作,但是使用case语句会出错

查询错误:错误:ER_BAD_FIELD_ERROR:“字段列表”中的未知列“dep_avg”

为什么会出现这个错误?

【问题讨论】:

  • 您使用的是mysql 还是sql-server?该错误不是 SQL Server 错误。
  • 至于错误,您试图通过其别名引用SELECT 中定义的列;你不能那样做。您需要重复表达式,或使用 CTE/子查询。
  • 输出列的别名不能在另一个输出列表达式中使用。您只能在 GROUP BY、HAVING、ORDER BY 中引用它。
  • 仅供参考 case 是一个表达式而不是一个语句
  • 为什么在date 列上使用LEFT()LEFT() 是一个字符串函数,日期应该使用适当的日期/时间数据类型来存储。

标签: mysql sql sql-server case window-functions


【解决方案1】:

您不能在同一个 select 子句中引用 select 子句中定义的别名。原因是别名可能还不能使用。最简单的方法是使用子查询:

WITH cte AS (
    SELECT LEFT(pay_date, 7) AS month, department_id,
           AVG(amount) OVER (PARTITION BY LEFT(pay_date, 7), department_id) AS dep_avg,
           AVG(amount) OVER (PARTITION BY LEFT(pay_date, 7)) AS com_avg
    FROM salary s
    INNER JOIN employee e
        ON s.employee_id = e.employee_id
)

SELECT month, department_id, dep_avg, com_avg,
       CASE WHEN dep_avg = com_avg THEN 'same' ELSE 'not same' END AS comparison
FROM cte;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2019-10-23
    • 2021-07-02
    • 2022-08-18
    • 2019-02-16
    • 1970-01-01
    • 2020-09-30
    相关资源
    最近更新 更多