同一 select 语句中的 ORDER BY 和 DISTINCT
ORDER BY and DISTINCT in same select statement
我计算了一个每日数字,该数字汇集了每个名称中输入的所有数字,因此我在每个名称下都有重复的行。我希望结果只显示每个用户一个结果,所以我认为最好使用 distinct。但是,我还需要按降序显示结果。这可以在同一条语句中执行吗?
SELECT DISTINCT
D.DATE,
COALESCE( M.[Team ADJ],D.[Team ADJ], M.[Name]) AS 'Sales Person',
COALESCE( D.[Team], M.[Team]) AS 'Sales Team',
isnull(D.[Daily Figure],0) AS [Daily Figure],
FROM
[Daily] D
FULL OUTER JOIN
[Month] M ON D.[Name] = F.[Name]
ORDER BY [Daily Figure] DESC
当前结果
Date Sales Person Sales Team Daily Figure Month
2017-09-19 FRED SAM 20 285
2017-09-19 FRED SAM 20 285
2017-09-19 FRED SAM 20 285
2017-09-19 TOM BEN 140 118
2017-09-19 TOM BEN 140 118
错误:'ORDER BY items must appear in the select list if SELECT DISTINCT is specified.' 尽管我已将其包含在 select 列表中
在 order by
部分,您可以通过别名引用该列,例如:
select distinct
[Date]
, coalesce( M.[Team adj],D.[Team adj], M.[Name]) as [Sales Person]
, coalesce( D.[Team], M.[Team]) as [Sales Team]
, isnull(D.[Daily Figure],0) as [Daily Figure]
, [Month]
from [Daily] D
full outer join [Month] M
on D.[Name] = F.[Name]
order by [Daily Figure] desc
如果没有源表来构建查询,这里是一个使用上面示例的演示:
select distinct
t.Date,
[Sales Person],
[Sales Team],
isnull(t.[Daily Figure],0) AS [Daily Figure]
from t
order by [Daily Figure] desc
rextester 演示:http://rextester.com/PVPHSR35614
returns:
+------------+--------------+------------+--------------+
| Date | Sales Person | Sales Team | Daily Figure |
+------------+--------------+------------+--------------+
| 2017-09-19 | tom | ben | 140 |
| 2017-09-19 | fred | sam | 20 |
+------------+--------------+------------+--------------+
解决此问题的最佳方法是按列号位置排序。例如。如果列在第4位'order by 4'
SELECT DISTINCT
COALESCE( M.[Team ADJ],D.[Team ADJ], M.[Name]) AS 'Sales Person',
COALESCE( D.[Team], M.[Team]) AS 'Sales Team',
isnull(D.[Daily Figure],0),
FROM
[Daily] D
FULL OUTER JOIN
[Month] M ON D.[Name] = F.[Name]
ORDER BY 4 DESC
示例查询未生成您发布的当前结果。
在 Distinct Order By 中,顺序列必须是结果集的一部分。在您的示例查询中,没有名为 Daily Figure 的列。如果在没有表达式的情况下使用 Daily Figure,Order By 将正常工作。但是,一旦将其包裹在表达式中,它就不再名为 Daily Figure。
最简单的解决方法是为列添加别名。
, isnull(D.[Daily Figure],0) as [Daily Figure]
*更新*
这是一个片段,您可以在任何 SQL 服务器上 运行 显示 Distinct Order By 的实际效果。
SELECT DISTINCT
t.type_desc,
CAST(t.create_date AS DATE) AS Created
FROM sys.tables AS t
ORDER BY Created
;
我计算了一个每日数字,该数字汇集了每个名称中输入的所有数字,因此我在每个名称下都有重复的行。我希望结果只显示每个用户一个结果,所以我认为最好使用 distinct。但是,我还需要按降序显示结果。这可以在同一条语句中执行吗?
SELECT DISTINCT
D.DATE,
COALESCE( M.[Team ADJ],D.[Team ADJ], M.[Name]) AS 'Sales Person',
COALESCE( D.[Team], M.[Team]) AS 'Sales Team',
isnull(D.[Daily Figure],0) AS [Daily Figure],
FROM
[Daily] D
FULL OUTER JOIN
[Month] M ON D.[Name] = F.[Name]
ORDER BY [Daily Figure] DESC
当前结果
Date Sales Person Sales Team Daily Figure Month
2017-09-19 FRED SAM 20 285
2017-09-19 FRED SAM 20 285
2017-09-19 FRED SAM 20 285
2017-09-19 TOM BEN 140 118
2017-09-19 TOM BEN 140 118
错误:'ORDER BY items must appear in the select list if SELECT DISTINCT is specified.' 尽管我已将其包含在 select 列表中
在 order by
部分,您可以通过别名引用该列,例如:
select distinct
[Date]
, coalesce( M.[Team adj],D.[Team adj], M.[Name]) as [Sales Person]
, coalesce( D.[Team], M.[Team]) as [Sales Team]
, isnull(D.[Daily Figure],0) as [Daily Figure]
, [Month]
from [Daily] D
full outer join [Month] M
on D.[Name] = F.[Name]
order by [Daily Figure] desc
如果没有源表来构建查询,这里是一个使用上面示例的演示:
select distinct
t.Date,
[Sales Person],
[Sales Team],
isnull(t.[Daily Figure],0) AS [Daily Figure]
from t
order by [Daily Figure] desc
rextester 演示:http://rextester.com/PVPHSR35614
returns:
+------------+--------------+------------+--------------+
| Date | Sales Person | Sales Team | Daily Figure |
+------------+--------------+------------+--------------+
| 2017-09-19 | tom | ben | 140 |
| 2017-09-19 | fred | sam | 20 |
+------------+--------------+------------+--------------+
解决此问题的最佳方法是按列号位置排序。例如。如果列在第4位'order by 4'
SELECT DISTINCT
COALESCE( M.[Team ADJ],D.[Team ADJ], M.[Name]) AS 'Sales Person',
COALESCE( D.[Team], M.[Team]) AS 'Sales Team',
isnull(D.[Daily Figure],0),
FROM
[Daily] D
FULL OUTER JOIN
[Month] M ON D.[Name] = F.[Name]
ORDER BY 4 DESC
示例查询未生成您发布的当前结果。
在 Distinct Order By 中,顺序列必须是结果集的一部分。在您的示例查询中,没有名为 Daily Figure 的列。如果在没有表达式的情况下使用 Daily Figure,Order By 将正常工作。但是,一旦将其包裹在表达式中,它就不再名为 Daily Figure。
最简单的解决方法是为列添加别名。
, isnull(D.[Daily Figure],0) as [Daily Figure]
*更新*
这是一个片段,您可以在任何 SQL 服务器上 运行 显示 Distinct Order By 的实际效果。
SELECT DISTINCT
t.type_desc,
CAST(t.create_date AS DATE) AS Created
FROM sys.tables AS t
ORDER BY Created
;