声明时按列号排序表

时间:2019-01-10 16:33:19

标签: sql sql-server tsql

在声明时是否可以按列号对表进行排序? 这是代码

;WITH
    Table1 AS (....),
    Table2 AS (....)

INSERT INTO #temp
SELECT TOP 50 
    one.id,
    one.sales,
    two.count,
    one.sales * two.count as 'Volume %'        
FROM Table1 one,
INNER JOIN Table2 two on one.id = two.id
ORDER BY 
    CASE  @order
        WHEN 1 THEN 
            7             ---Column number here since [Volume %] giving me an error
        WHEN 2 THEN
            10            ---Column number
        END
    DESC

4 个答案:

答案 0 :(得分:3)

我已经进行了一些测试,并了解到,虽然直接的ORDER BY可以引用列别名(即使是带有空格字符的别名),但ORDER BY中的CASE表达式不能。我从未在任何地方看到过对此文档的记录,但是我自己进行了测试。

别名中是否有特殊字符都没关系。如果您只做过:

one.sales * two.count as Volume   

您仍然会遇到以下错误:

  ORDER BY CASE @order
   WHEN 1 THEN Volume

我怀疑这是您不能使用列号的相同原因。

作为解决此问题的可靠方法,我的建议是:

  ORDER BY CASE @order
   WHEN 1 THEN  one.sales * two.count

答案 1 :(得分:1)

由于您在评论中提到您要仅尝试按卷%的降序将仅前50条记录添加到临时表,因此您可以执行以下操作:

;WITH
    Table1 AS (....),
    Table2 AS (....)

INSERT INTO #temp
SELECT TOP 50 
    one.id,
    one.sales,
    two.count,
    one.sales * two.count as 'Volume %'        
FROM Table1 one,
INNER JOIN Table2 two on one.id = two.id
ORDER BY [Volume %] DESC

答案 2 :(得分:1)

ORDER BY的{​​{3}}:

  

如果ORDER BY子句从选择列表中引用了列别名,   列别名必须独立使用,不能作为某些名称的一部分   中的表达式 ...

在表达式中可以使用列 name 而不是 alias case

另外:

  

order_by_expression

     

指定要排序的列或表达式   查询结果集。可以将排序列指定为名称或   列别名,或一个非负整数,代表   选择列表中的列。

这意味着,如果您order by 1,订单将由选择列表中的第一列确定。使用表达式,例如order by Length * 0 + 1,即使表达式恰好等于1,也不会按第一列排序。

将NULL值移到其他值之后的常见技术是:

select Sample
  from Samples
  order by case when Sample is NULL then 1 else 0 end, Sample;

您不希望该case表达式按位置选择一列。

此外:我认为解析器有一个错误:order by 1按第一个结果列正确排序。使用表达式order by ( 1 )也会按顺序排列第一个结果列,但应产生与order by 1 + 0相同的错误:“在ORDER BY列表的位置1遇到常量表达式。”

它可能是简单表达式documentation的草率解析模式的一部分。

答案 3 :(得分:0)

如果它们是数字,您可以尝试

  ....
  ORDER BY 
(CASE WHEN @ORDER = 1 THEN 1 ELSE 0 END ) * col1 + (CASE WHEN @ORDER = 2 THEN 1 ELSE 0 END ) * col2
DESC

或什至对字符串的某种类似破解

您尝试过

SELECT TOP 50 
    one.id,
    one.sales,
    two.count,
    one.sales * two.count as 'Volume %'        
FROM Table1 one,
INNER JOIN Table2 two on one.id = two.id
ORDER BY 
    CASE  @order
        WHEN 1 THEN 
            one.sales * two.count            ---Column number here since [Volume %] giving me an error
        WHEN 2 THEN
            two.count           ---Column number
        END
    DESC

您不能使用计算出的重命名字段,可以吗?除非您使用子查询