Как сгруппировать по вновь созданному столбцу с псевдонимом старого столбца? - PullRequest
0 голосов
/ 06 ноября 2018

Я хочу изменить столбец, сохраняя псевдоним старого столбца. Но когда я группирую по нему, возникает ошибка.

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.поставление номера столбца в предложении 'group by'

SELECT number1-number2 AS number1  FROM some_table GROUP BY 1

Есть ли способ как-то сохранить старый псевдоним без указанных выше решений?

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Ваш оригинальный запрос - лучший способ написать такой запрос. Вы всегда должны использовать псевдонимы, которые отличаются от имен столбцов.

Ваш второй запрос не завершен, что несколько скрывает использование псевдонима, равного имени столбца. Имена псевдонимов, определенные в предложении 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.)

0 голосов
/ 07 ноября 2018

Вы можете использовать номер столбца результата вместо имени.

Например:

GROUP BY 2
0 голосов
/ 06 ноября 2018

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...