【问题标题】:Order by with variable Coalesce使用变量 Coalesce 排序
【发布时间】:2022-01-26 04:28:38
【问题描述】:

我有以下sql命令

DECLARE @cols NVARCHAR (MAX)
SELECT @cols = COALESCE (@cols + ',['+ cast(Month as nvarchar(2))+']' , '['+ Cast(Month as nvarchar(2))+']')
FROM    (select distinct Month from Employee  WHERE  Year*100+Month BETWEEN 201704 and 201712 ) as e
PRINT @cols 

结果是

[9],[12],[6],[7],[10],[4],[5],[11],[8]

但我真的希望它产生排序顺序

[4],[5],[6],[7],[8],[9],[10],[11],[12]

【问题讨论】:

  • 给出错误消息 1033,级别 15,状态 1,第 3 行 ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非 TOP、OFFSET 或 FOR还指定了 XML。
  • @NassimH 是什么让您认为这必然会得到不同的结果?最终,最终的SELECT 可能会以任何顺序返回结果,并且可能无法正确聚合

标签: sql sql-server tsql


【解决方案1】:

变量合并 is documented 是不确定的,而 may cause incorrect results,尤其是在存在 ORDER BY 的情况下。您也不能将ORDER BY 放在派生表或视图中,原因很明显:最终排序由外部查询确定。

您应该只使用STRING_AGG 进行聚合。您可以使用WITHIN GROUP (ORDER BY 获取订单。

另请注意:

  • 始终使用 QUOTENAME 将括号括在列名中,而不是自己动手,因为转义可能很复杂。
  • 最好对列进行精确比较,而不是对它们进行计算然后比较,因为这样您就可以命中索引(sarge-ability)。
  • 最好将日期存储在实际日期列中,而不是乱用多个列,但我会将数据库重新设计留给您
DECLARE @cols NVARCHAR(MAX) = (
    SELECT STRING_AGG(QUOTENAME(Month), N',') WITHIN GROUP (ORDER BY Month)
    FROM (
        select distinct
          Month
        from Employee
        WHERE Year = 2017
          AND Month BETWEEN 4 AND 12
    ) as e
);

对于 SQL Server 2016 及更早版本,您可以使用旧的 FOR XML 方法:

DECLARE @cols NVARCHAR(MAX) = STUFF((
    SELECT N',' + QUOTENAME(Month)
    FROM (
        select distinct
          Month
        from Employee
        WHERE Year = 2017
          AND Month BETWEEN 4 AND 12
    ) as e
    ORDER BY Month
    FOR XML PATH(''), TYPE
  ).value('text()[1]','nvarchar(max)')
  , 1, LEN(N','), N'');

【讨论】:

  • 我收到此错误:消息 195,级别 15,状态 10,第 2 行“STRING_AGG”不是可识别的内置函数名称。消息 156,级别 15,状态 1,第 9 行关键字“as”附近的语法不正确。我正在使用 sql server 2016
  • 好的,给你一个旧版本的解决方案
  • 工作得很好,我也在使用我的第一个比较(年*100+月之间...),因为有时需要一年以上。
  • 你仍然应该使用AND/OR逻辑,例如WHERE (Year = 2017 AND Month BETWEEN 4 AND 12) OR (Year = 2018 AND Month BETWEEN 1 AND 5)
猜你喜欢
  • 1970-01-01
  • 2016-06-06
  • 2019-05-21
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 2020-12-12
  • 2022-12-16
  • 2022-01-22
相关资源
最近更新 更多