tsql - 如何使我的 RANK () OVER 查询在选择中工作?
问题描述
我有这张表,我需要按以下方式排序:
- 需要按薪水对部门进行排名;
- 如果 Salary = NULL 需要显示 - '没有要显示的数据' 消息
- 需要加上支付给部门的总工资
- 需要统计部门人员
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
子句中。
为什么这样?
解决方案
列 '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
推荐阅读
- python - 如何将默认 tkinter 字体应用于所有 tkinter 窗口
- laravel - 如何在 laravel 中默认向所有控制器添加方法?
- hibernate - 多对一映射上的休眠过滤器
- flutter - BlocBuilder 无法在新版本的颤振中将动态按钮构建到表单中
- java - Apache POI - 检索 .doc 文件中关键字之间的文本内容并有条件地呈现它
- sql-server - 由于未安装 SSIS 但存在 SSISDB 数据库,因此 SQL 实例在修补后无法启动
- node.js - 如何修复 CORS 和 cookie 的错误?
- sql - 使用 PostgreSQL 函数将所有者更改为所有表
- vuetify.js - 添加 v-model 对象后,Vuetify 表单显示空白
- html - 如何在不同的视图中使用 django 表单中的数据