在声明时是否可以按列号对表进行排序? 这是代码
;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
答案 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
您不能使用计算出的重命名字段,可以吗?除非您使用子查询