Sql 如何按别名为旧列的新创建列分组?
我想修改保留旧列别名的列。但当我按它分组时,会发生错误Sql 如何按别名为旧列的新创建列分组?,sql,postgresql,Sql,Postgresql,我想修改保留旧列别名的列。但当我按它分组时,会发生错误 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_ta
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 new_number AS number1 FROM (
SELECT number1-number2 AS new_number FROM some_table GROUP BY new_number) AS query
2.在“分组依据”条款中提供列号
SELECT number1-number2 AS number1 FROM some_table GROUP BY 1
有没有办法在没有上述解决方案的情况下以某种方式保留旧别名?您可以使用
交叉应用:
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
原始查询是编写此类查询的最佳方式。应始终使用与列名不同的别名
您的第二个查询是不完整的,使用与列名相等的别名会使其变得有些模糊。SELECT
子句中定义的别名不能在groupby
子句中使用,因为后者发生在前者之前。因此,你得到的是:
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
(当然,如果不进行任何聚合,这仍然毫无意义,但我知道,这只是一个例子:-)
无论如何,为别名重新使用列名仍然是个坏主意。想象一下,按数字1排序
——那是指什么;列名还是别名?(我很确定别名在这里具有优先权,但我不知道SQL标准是否真的定义了它。)您可以使用结果列编号而不是名称
例如:
您甚至不能在MS SQL Server中按新的\u编号分组。@SQL Hacks。你说得对,我忘了提到我在postgresql中测试过它
GROUP BY 2