首页 > 解决方案 > 如何使我的 RANK () OVER 查询在选择中工作?

问题描述

表格图像

我有这张表,我需要按以下方式排序:

  1. 需要按薪水对部门进行排名;
  2. 如果 Salary = NULL 需要显示 - '没有要显示的数据' 消息
  3. 需要加上支付给部门的总工资
  4. 需要统计部门人员
    SELECT RANK() OVER (
                ORDER BY Salary DESC
                )
            ,CASE 
                WHEN Salary IS NULL
                    THEN 'NO DATA TO BE SHOWN'
                ELSE Salary
                    ,Count(Fname)
                    ,Total(Salary) FROM dbo.Employees

我收到一条错误消息:

列“dbo.Employees.Salary”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。

为什么这样?

标签: tsql

解决方案


列 'dbo.Employees.Salary' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

为什么这样?

聚合函数为整个表返回一个值,你不能在它们旁边选择一个字段,这是没有意义的。比如说,你有一个学生表,你申请Sum(marks)了整个学生表,然后你也在Select studentname查询中选择学生的名字。数据库引擎会选择哪个学生的名字?令人困惑

列“在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中”

我试过这个 - 使用内部查询

SELECT RANK() OVER (ORDER BY SAL DESC) RANK,FNAME,DEPARTMENT
CASE 
    WHEN SAL IS NULL THEN 'NO DATA TO BE SHOWN'
    ELSE SAL
END
FROM
(SELECT COUNT(FNAME) FNAME, SUM(SALARY) SAL, DEPARTMENT
 FROM TESTEMPLOYEE
 GROUP BY DEPARTMENT) t

推荐阅读