如何在一个新创建的带有旧列别名的列上进行分组?

3

我想修改一个列,保留旧列的别名。但是当我按它进行分组时出现错误。

CREATE TABLE some_table (
 number1 integer,
 number2 integer,
 name text
)

使用新的别名后,它可以正常工作:

SELECT number1-number2 AS new_number FROM some_table GROUP BY new_number

但是如果我想保留旧的列名:

SELECT number1-number2 AS number1 FROM some_table group by number1

列“some_table.number2”必须出现在GROUP BY子句中或用于聚合函数

我可以用两种方法解决这个问题:

1.将其包装在另一个select语句中

SELECT new_number AS  number1 FROM (
SELECT number1-number2 AS new_number  FROM some_table GROUP BY new_number) AS query

2. 在“group by”子句中提供列号

SELECT number1-number2 AS number1  FROM some_table GROUP BY 1

有没有办法在不使用上述提供的解决方案的情况下保留旧别名呢?

1
在MS SQL Server中,甚至无法按new_number进行分组。 - SQL Hacks
@SQL技巧。您是对的,我忘记提到我在postgresql中测试了它。 - beatrice
3个回答

1
你可以使用 cross apply:
SELECT v.new_number
FROM some_table t CROSS APPLY
     (VALUES (t.number1 - t.number2)) v(new_number)
GROUP BY v.new_number;

你也可以这样做:

SELECT v.number1
FROM some_table t CROSS APPLY
     (VALUES (t.number1 - t.number2)) v(number1)
GROUP BY v.number1

1

您最初的查询是编写此类查询的最佳方法。您应始终使用与列名不同的别名。

您的第二个查询是不完整的,使用与列名相等的别名名称有些混淆。在SELECT子句中定义的别名不能在GROUP BY子句中使用,因为后者发生在前者之前。所以您拥有的是:

SELECT number1-number2 AS number1 FROM some_table
GROUP BY some_table.number1

当你需要的时候

SELECT number1-number2 AS number1 FROM some_table
GROUP BY some_table.number1, some_table.number2

或者不使用表限定符:

SELECT number1-number2 AS number1 FROM some_table 
GROUP BY number1, number2

(当然,如果没有聚合操作的话,这仍然几乎毫无意义,但我知道,这只是一个例子 :-))

无论如何,重复使用列名作为别名仍然是个坏主意。想象一下 ORDER BY number1 - 这会指代哪个,列名还是别名?(我很确定别名优先级更高,但我不知道这是否实际上被 SQL 标准定义为是这样。)


1
你可以使用结果列的编号而不是名称。
例如:
GROUP BY 2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接