同一 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
;