Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql case-when语句中按列号排序的表_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 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

在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 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
表达式中有关于列别名的文档。我添加了一个包含详细信息的示例。