【问题标题】:ORDER BY and DISTINCT in same select statementORDER BY 和 DISTINCT 在同一个选择语句中
【发布时间】:2017-09-20 12:31:12
【问题描述】:

我计算了一个每日数字,它将每个名称输入的所有数字汇总在一起,因此我在每个名称下都有重复的行。我希望结果每个用户只显示一个结果,所以我认为最好使用 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

错误:'如果指定了 SELECT DISTINCT,则 ORDER BY 项目必须出现在选择列表中。即使我已将其包含在选择列表中

【问题讨论】:

  • 为什么在您的SELECT 中没有Date 列?否则,您的查询应该可以正常工作。
  • 如果您仅按名称加入,您将获得例如 3 条 Month 记录和 90 条 Daily 记录,结果仅包含该名称的 270 行。这是故意的吗?请考虑您希望在结果中看到什么。每个名称和月份一个记录?每个名字和一天一个记录?每个名字一个记录? DateDaily FigureMonth 应该包含哪些列?
  • “我想要 DISTINCT 但是...”通常是一个线索,您应该查看 a) 首先为什么会得到重复的结果和/或 b) 您是否实际上需要GROUP BY 并聚合。目前,我不清楚这更像是 (a) 还是 (b) 情况。
  • 当执行 SELECT DISTINCT 时,您只能 ORDER BY 选择列表项。
  • 顺便说一句,单引号是用于sting文字的。不要将它们用作别名。

标签: sql sql-server sql-order-by distinct


【解决方案1】:

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

返回:

+------------+--------------+------------+--------------+
|    Date    | Sales Person | Sales Team | Daily Figure |
+------------+--------------+------------+--------------+
| 2017-09-19 | tom          | ben        |          140 |
| 2017-09-19 | fred         | sam        |           20 |
+------------+--------------+------------+--------------+

【讨论】:

  • error '如果指定了 SELECT DISTINCT,ORDER BY 项目必须出现在选择列表中。'我已将其包含在选择列表中
【解决方案2】:

示例查询未生成您发布的当前结果。

在 Distinct Order By 中,顺序列必须是结果集的一部分。在您的示例查询中,没有名为 Daily Figure 的列。如果在没有表达式的情况下使用 Daily Figure,Order By 就可以正常工作。但是,一旦将其包装在表达式中,它就不再被命名为 Daily Figure。

最简单的解决方法是为列设置别名。

, isnull(D.[Daily Figure],0) as [Daily Figure]

* 更新 *

这是一个可以在任何显示 Distinct Order By 的 SQL Server 上运行的 sn-p。

SELECT DISTINCT
            t.type_desc,
            CAST(t.create_date AS DATE) AS Created
  FROM      sys.tables AS t
  ORDER BY  Created
;

【讨论】:

  • 我已经用别名试过了,但它在 sql server 中不起作用
  • 更新您在问题中发布的查询语句。我们缺少一些东西。我已经多次使用 Distinct Order By 了。它的规则非常简单。
  • 那是代码哈哈。我已经使用了订单 3,效果很好
  • SQL Server 绝对允许使用别名进行 Distinct Order By。我刚刚发布了一个代码 sn-p 显示它。
  • 它只是不允许在我的代码中按别名排序。会不会和 COALESCE 有关?
【解决方案3】:

解决此问题的最佳方法是按列号位置排序。例如。如果列在第 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

【讨论】:

  • 我建议不要在保存的生产代码中按列序号进行排序。当有人稍后修改代码时,它可能会引入故障点。但是,我一直在运行一次查询中使用它们。
猜你喜欢
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
相关资源
最近更新 更多