【问题标题】:How to Order BY without having Column in SELECT如何在 SELECT 中没有列的情况下按顺序排序
【发布时间】:2012-10-15 19:34:55
【问题描述】:

我正在使用 MS-SQL,我有一个这样的表:

Count  Code
1      A
2      C
3      A
4      B
5      C
6      B

我只需要获取代码列的不同行,但我需要保持列的顺序来创建一个逗号分隔的字符串,如下所示:

    A, C, B

我已尝试使用以下代码未收到消息 145、级别 15 的 SQL 错误 - 如果指定了 SELECT DISTINCT,则 ORDER BY 项必须出现在选择列表中。

SELECT @tlist = ISNULL(@tlist+', ','') + Code 
FROM (SELECT DISTINCT t.Code  
     FROM @Table t) 

但我得到 A、B、C 的输出

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    所以,你不想要distinct。你要group by:

    select t.code
    from @Table t
    group by t.code
    order by min(count)
    

    您可以按select 子句中未提及的列进行排序。

    要将逗号分隔的列表作为单个变量获取,请使用以下技术:

    select stuff((select ', '+t.code
                  from @Table t
                  group by t.code
                  order by min(count)
                  for xml path ('')
                 ), 1, 2, '')
    

    Order by 在子查询中通常是未定义的。而且,您将列表按顺序连接在一起的方法不能保证有效。

    【讨论】:

    • 通过使用 group by 作为子查询,我收到错误消息 1033,级别 15 - ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非 TOP或 FOR XML 也被指定。但是当我在 SELECT 和 t.code 之间添加 TOP 100 时,它可以工作。
    【解决方案2】:

    在您的子查询中对它们进行排序

    SELECT DISTINCT t.Code  
    FROM @Table t
    ORDER BY t.Code
    

    【讨论】:

    • 。 .提问者似乎希望按第一列排序,而不是按代码字母顺序。
    • 添加ORDER BY t.Code会抛出错误Msg 1033,级别15,ORDER BY子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非TOP或 FOR XML 也被指定。
    • 试试,SELECT @tlist = ISNULL(@tlist+', ','') + Code FROM ( SELECT CODE FROM ( SELECT DISTINCT t.Code FROM @Table t ) xx ORDER BY CODE )
    猜你喜欢
    • 1970-01-01
    • 2012-08-27
    • 2016-07-01
    • 2014-06-19
    • 2014-08-14
    • 2016-03-30
    • 2023-02-18
    • 2011-11-20
    • 1970-01-01
    相关资源
    最近更新 更多