Tsql 如何使我的排名()在select查询中起作用?

Tsql 如何使我的排名()在select查询中起作用?,tsql,Tsql,我有这个表,我需要按以下方式排序: 需要按工资对部门进行排名 如果薪资=NULL,则需要显示“无需显示数据”消息 需要添加支付给部门的总工资 需要统计部门里的人数 我得到一个错误,说: “dbo.Employees.Salary”列在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中 为什么会这样 列“dbo.Employees.Salary”在选择列表中无效,因为它 未包含在聚合函数或GROUP BY中 条款 为什么会这样 聚合函数为整个表返回一个值,不能选择旁边的字段,这没有意义

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

  • 需要按工资对部门进行排名
  • 如果薪资=NULL,则需要显示“无需显示数据”消息
  • 需要添加支付给部门的总工资
  • 需要统计部门里的人数
  • 我得到一个错误,说:

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

    为什么会这样

    列“dbo.Employees.Salary”在选择列表中无效,因为它 未包含在聚合函数或GROUP BY中 条款

    为什么会这样

    聚合函数为整个表返回一个值,不能选择旁边的字段,这没有意义。比如说,您有一个学生表,可以为整个学生表应用
    Sum(marks)
    ,然后在查询中选择学生名
    selectstudentname
    。数据库引擎将选择哪个学生的名字?混乱的

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

    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
    

    计数(Fname)
    是一个聚合函数。为了在旁边显示另一个字段(如
    Salary
    ),需要在另一个字段上使用
    group by
    子句。您上面的查询似乎缺少case语句的结尾。。。简单的规则是,一旦查询选择了聚合(如count、sum、avg),所有其他列(或表达式)都需要在groupby字段列表中列出。在您的陈述中,当薪资为空时,按案例添加
    分组,然后“无需显示数据”,否则薪资结束将起作用。
    
    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