如何在新创建的具有旧列别名的列上分组?

时间:2018-11-06 17:21:34

标签: sql postgresql

我想修改保留旧列别名的列。但是当我按它分组时,会发生错误。

var regex = /((([12]\d{3})(-(0[1-9]|1[0-2]))*)(-(0[1-9]|[12]\d|3[01]))*)/;

使用新别名可以工作:

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

但是一旦我想保留旧的列名:

SELECT number1-number2 AS new_number FROM some_table GROUP BY new_number

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

我可以通过两种方式解决此问题:

1。将其包装在另一个选择下

SELECT number1-number2 AS number1 FROM some_table group by number1

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

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

如果没有上面提供的解决方案,是否可以通过某种方式保留旧别名?

3 个答案:

答案 0 :(得分: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 :(得分: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标准定义的。)

答案 2 :(得分:1)

您可以使用结果列号代替名称。

例如:

GROUP BY 2