Подтвердить что ты не робот

PostgreSQL Где условие подсчета

У меня есть следующий запрос в PostgreSQL:

SELECT 
    COUNT(a.log_id) AS overall_count
FROM 
    "Log" as a, 
    "License" as b 
WHERE 
    a.license_id=7 
AND 
    a.license_id=b.license_id 
AND
    b.limit_call > overall_count
GROUP BY 
    a.license_id;

Почему я получаю эту ошибку:

ОШИБКА: столбец "total_count" не существует

Моя структура таблицы:

License(license_id, license_name, limit_call, create_date, expire_date)
Log(log_id, license_id, log, call_date)

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

4b9b3361

Ответ 1

SELECT a.license_id, a.limit_call
     , count(b.license_id) AS overall_count
FROM   "License"  a
LEFT   JOIN "Log" b USING (license_id)
WHERE  a.license_id = 7 
GROUP  BY a.license_id  -- , a.limit_call  -- add in old versions
HAVING a.limit_call > count(b.license_id)

Основные моменты

  • В версиях до PostgreSQL 9.1 вы должны добавить limit_call в предложение GROUP BY. Начиная с версии 9.1 достаточно иметь первичный ключ в предложении GROUP BY. Примечания к выпуску для 9.1:

    Разрешить столбцы GROUP BY non- в списке целей запроса, когда первичный ключ указан в предложении GROUP BY

  • Условие WHERE должно перейти к предложению HAVING, поскольку оно относится к результату агрегатной функции. И вы не можете ссылаться на выходные столбцы (псевдонимы столбцов) в предложении HAVING, где вы можете ссылаться только на входные столбцы. Поэтому вы должны повторить выражение. По документации:

    Имя выходного столбца может использоваться для ссылки на значение столбца в предложениях ORDER BY и GROUP BY, но не в WHERE или HAVING; там вы должны выписать выражение вместо этого.

  • Я изменил порядок таблиц в предложении FROM и немного очистил синтаксис, чтобы сделать его менее запутанным. USING - это просто примечательное удобство.

  • Я использовал LEFT JOIN вместо JOIN, поэтому вы не исключаете лицензии без каких-либо журналов.

  • Я бы посоветовал не использовать смешанные идентификаторы случая в Postgres, если это возможно. Очень склонна к ошибкам.

  • Только значения non- нулевые значения подсчитываются count(). Поскольку вы хотите подсчитать связанные записи в таблице "Log" это безопаснее и немного дешевле использовать count(b.license_id). Этот столбец используется в соединении, поэтому нам не нужно беспокоиться о том, является ли столбец нулевым или нет.
    count(*) еще короче и немного быстрее. Если вы не возражаете, чтобы получить счет 1 для 0 строк в левой таблице, используйте это.

Ответ 2

Запрос where не распознает ваш псевдоним столбца, и, кроме того, вы пытаетесь отфильтровать агрегацию после. Попробуйте:

SELECT 
COUNT(a.log_id) AS overall_count
FROM 
"Log" as a, 
"License" as b 
WHERE 
a.license_id=7 
AND 
a.license_id=b.license_id 
GROUP BY 
a.license_id
having b.limit_call > count(a.log_id);

Предложение having похоже на предложение where, за исключением того, что оно обрабатывает столбцы после агрегации, тогда как предложение where работает над столбцами перед агрегацией.

Также есть причина, почему ваши имена таблиц заключены в двойные кавычки?