如何按我不想在输出中显示的列排序?

Art*_*and -2 sql sql-server

我正在尝试生成一个查询以按特定分组和顺序显示特定数据。我遇到的唯一问题是,为了获得列中数据的正确顺序,我需要按我未选择且不想显示的列对其进行排序。

因此,当我尝试按该列排序时,我收到错误:

“列 ** 在 ORDER BY 子句中无效,因为它未包含在聚合函数或 GROUP BY 子句中。”

有没有一种语法可以让我做到这一点?这是我正在处理的查询:

select Pr.EmployeeNo as EmpNo, EmployeeFName as EmpFName, EmployeeLName as EmpLName,
ProjectName, ProjectStartDate as ProjStartDate, JobName as Job, JobRate, HoursWorked as Hours
from Employee as Em join ProjEmp as Pr on Em.EmployeeNo = Pr.EmployeeNo
                    join Project as Pt on Pr.ProjectID = Pt.ProjectID
                    join Job as Jb on Em.JobID = Jb.JobID
Group by Pr.EmployeeNo, EmployeeFName, EmployeeLName, ProjectName, ProjectStartDate, JobName, JobRate, HoursWorked
Run Code Online (Sandbox Code Playgroud)

Joe*_*orn 5

停止并再次阅读完整的错误。它准确地告诉您发生了什么。提示:问题不在于子句中缺少它SELECT。您没有理由不能这样做:

SELECT ColumnA
FROM [Table1]
ORDER BY ColumnB
Run Code Online (Sandbox Code Playgroud)

问题是你有一个GROUP BY条款:

ORDER BY 子句中的列无效,因为它未
包含在聚合函数或 GROUP BY 子句中。

这是有道理的。假设你有这张表:

A列 B栏 C栏
1 2 3
1 4 9
2 6 7
2 8 5

然后尝试运行此查询:

SELECT ColumnA, MAX(ColumnB)
FROM [Table]
GROUP BY ColumnA
ORDER BY ColumnC
Run Code Online (Sandbox Code Playgroud)

此查询尝试按 ColumnC 进行 ORDER BY ColumnC,但每一组中 ColumnC 都有多个值!我们在 ColumnA 上有两个组:12。组1有两个“C”值:39。Group2还有两个“C”值:75。根据选择的行,您最终可能会得到不同的订单

不过 ColumnA 没问题,因为它是表达式的一部分GROUP BY。这意味着我们知道要使用什么值。MAX(ColumnB)也可以,因为MAX()是一个聚合函数。它告诉我们以确定的方式使用组中的哪个值。但ColumnC 引用不明确(!),因此是不允许的。

因此,在问题的 SQL 中,您可以自由地将这些列中的任何一个用于子句ORDER BY

Pr.EmployeeNo, EmployeeFName, EmployeeLName, ProjectName, ProjectStartDate, JobName, JobRate, HoursWorked
Run Code Online (Sandbox Code Playgroud)

如果要使用不同的列,则必须更改分组(并仔细考虑后果)或对列组使用聚合函数。