Ошибка в предложении 'after' после 'group by' - PullRequest
0 голосов
/ 24 октября 2018

У меня следующий SQL-запрос:

SELECT
     to_char(p.log_date, 'Mon') as mon,
     extract(year from p.log_date) as year,
from
     T
group by
     mon
having
     mon = 'september'
and
     year = '2018';

Таблица в следующем формате:

date        col1     col2
2018/09/10   --       --
2018/09/11   --       --
2018/09/12   --       --

T не имеет столбцов mon и year.Я получаю сообщение об ошибке ERROR: column "mon" does not exist. Как это исправить?

Ответы [ 5 ]

0 голосов
/ 24 октября 2018

Это очень просто, попробуйте это.

Select mon, [year] from (
  SELECT
     to_char(p.log_date, 'Mon') as mon,
     extract(year from p.log_date) as year,
 from T

) as DerivedTable

 where  mon = 'september' and  year = '2018'

group by mon
0 голосов
/ 24 октября 2018

Having используется для условия агрегатной функции, но вам не нужно его использовать, потому что to_char и extract являются нормальной функцией.

Я думаю, вы забыли использовать предложение FROM длявыберите стол.

SELECT
     to_char(p.log_date, 'Mon') as mon,
     extract(year from p.log_date) as year,
FROM T
WHERE 
    to_char(p.log_date, 'Mon') = 'september'
AND
    extract(year from p.log_date) = '2018';
0 голосов
/ 24 октября 2018

используйте предложение where без необходимости иметь

SELECT
     to_char(p.log_date, 'Mon') as mon,
     extract(year from p.log_date) as year from your_table
where  to_char(p.log_date, 'Mon') = 'september'
and
     extract(year from p.log_date) = '2018'

Поскольку агрегатная функция отсутствует, не думайте, что здесь group by need

, а mon - это имя псевдонима вашего столбца, которое не найденоДБ в фильтре, поэтому его ошибка.

Примечание. Не все базы данных поддерживают псевдоним в фильтре (где или с указанием)

0 голосов
/ 24 октября 2018

Использование псевдонима в предложении HAVING вызывает проблему.Вы можете использовать выражение to_char в выражении HAVING (или WHERE).Но чтобы избежать репликации кода, вы должны выполнить подзапрос или CTE:

SELECT
     mon,
     year,
     ...
FROM (
    SELECT 
        to_char(p.log_date, 'Mon') as mon, 
        extract(year from p.log_date) as year,
        ... 
    FROM ...
)s
group by
     mon
having
     mon = 'september'
and
     year = '2018';

CTE:

WITH my_sub_query AS (
    SELECT 
        to_char(p.log_date, 'Mon') as mon, 
        extract(year from p.log_date) as year,
        ... 
    FROM ...
)
SELECT
     mon,
     year,
     ...
FROM my_sub_query
group by
     mon
having
     mon = 'september'
and
     year = '2018';

Более того:

  1. Попробуйтеиспользуйте WHERE вместо HAVING
  2. Для группировки по месяцу и году вы можете сделать date_trunc('month', p.log_date) вместо to_char и extract
0 голосов
/ 24 октября 2018

Попробуйте ниже - это произошло при использовании псевдонима

SELECT
     to_char(p.log_date, 'Mon') as mon,
     extract(year from p.log_date) as year
where to_char(p.log_date, 'Mon')= 'september'
and year = '2018';
...