Sql case-when语句中按列号排序的表
在case when语句中,是否可以使用列号对表进行排序? 这是密码Sql case-when语句中按列号排序的表,sql,sql-server,tsql,Sql,Sql Server,Tsql,在case when语句中,是否可以使用列号对表进行排序? 这是密码 ;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
;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
如果是数字,你可以试试
....
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
您不能使用计算的重命名字段,是吗?除非使用子查询,因为您在注释中提到您正试图按卷百分比降序将前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
我做了一些测试并了解到,虽然ORDER BY可以引用列别名(即使是带有空格字符的列别名),但ORDER BY中的大小写表达式却不能。我从来没有在任何地方看到过这个文档,但我自己已经测试过了 别名中是否有特殊字符并不重要。如果你只做了:
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
从订购人的中:
如果ORDER BY子句引用select列表中的列别名,
列别名必须单独使用,而不是作为某些列的一部分使用
表达式在ORDER BY子句中
表达式中可以使用列名,而不是别名,例如大小写
此外:
按表达式排序
指定要排序的列或表达式
查询结果集。排序列可以指定为名称或名称
列别名,或表示
选择列表中的列
这意味着,如果按1下单,则顺序将由选择列表中的第一列确定。使用表达式(例如,按长度排序*0+1
)将不会按第一列排序,即使表达式的计算结果恰好为1
在其他值之后移动空值的常见技术是:
select Sample
from Samples
order by case when Sample is NULL then 1 else 0 end, Sample;
您不希望该case
表达式按位置选择列
旁白:我认为解析器有一个bug:orderby1
正确地按第一个结果列排序。使用表达式order by(1)
也按第一个结果列排序,但应生成与order by 1+0
相同的错误:“在order by列表的位置1中遇到常量表达式。”
这可能是对简单表达式的草率解析模式的一部分:.不使用列名的原因是什么?@Sami尝试过,但给我一个错误,说无效列名
您可以按列号排序,因为列号在范围内,所以如果您有3列,按4排序,这将抛出一个错误,因为没有4列。也不需要使用CASE,只要orderby(SELECT@Variable)
CASE是一个表达式,用于返回一个值。你正试图用它来控制逻辑,而这是你做不到的。而且不要按顺序排列,如果您的查询每次都更改,那么很容易出错。是否需要插入以控制标识的值?若并没有,那个么向insert添加顺序是毫无意义的,因为一个表是一个无序的集合7
或10
超出范围,不是吗?您确定ORDER BY
子句中有列别名Volume%
可用吗?是的,但它必须放在括号中([Volume%]
)您忘了我有一个可变项@OrderYeah这完全忽略了根据@order
参数按不同列排序的需要。我忽略@order
的原因是OP评论说“我正试图按卷百分比降序将前50条记录添加到临时表中”,并且只有一种方法排序[Volume%]
。我正在考虑这个问题。我不知道为什么按
订购会这样。我会接受你的回答,因为它给出了解释。另一个问题是,我有几个列正在计算,在那里我也使用了case
语句。如果我在order查询中添加这些,它将是一个大混乱。我创建了另一个临时表,在该表中插入我生成的表中的前50名,无需排序。无论如何谢谢你!第一个层次的“为什么”是因为在ORDERBY中有一个大小写表达式会导致解析器在分配别名之前确定ORDERBY,而在分配别名之后解析普通ORDERBY。第二层,解析器为什么这样做?没有线索。奇怪的是我找不到任何类似的问题。想知道怎么没有人有这样的问题。自从一年前我开始使用sql
ing以来。@TabAlleman在orderby
表达式中有关于列别名的文档。我添加了一个包含详细信息的示例。