Фильтрация по столбцам, созданным с использованием CASE Postgresql

#sql #postgresql #case #having-clause

Вопрос:

У меня есть таблица ниже:

 id int
user_id int
created_at datetime
status varchar
type varchar
 

и я пытаюсь ответить на вопрос «Напишите запрос, который возвращает идентификатор пользователя всех пользователей, которые создали по крайней мере одно представление»Рефинансирование» и по крайней мере одно представление «В школе»».

Я понял, как это будет сделано:

 select
    a.user_id
from
    (select
        user_id,
        sum(
            case
                when type='Refinance' then 1 else 0 end) as "Refinancecount",
        sum(
            case
                when type='InSchool' then 1 else 0 end) as "Inschoolcount"
    from
        loans
    group by 1) as a
where a.Refinancecount>=1 and a.Inschoolcount>=1
 

Когда я запускаю только внутренний запрос, все в порядке. Я получаю 3 столбца, но когда я запускаю весь запрос, он говорит, что столбец Refinancecount не найден.
Я посмотрел в Интернете и обнаружил, что, когда я создаю псевдонимы для своих столбцов, я не должен заключать их в двойные кавычки, и запрос отлично сработал, используя это предложение.
Но я прочитал больше о создании столбцов с использованием регистра в postgre и обнаружил, что люди заключают имена столбцов в двойные кавычки (я приложил пример скриншота)введите описание изображения здесь.
Тогда почему мой запрос не работает таким образом.

Ответ №1:

Вы должны процитировать эти поля в where предложении. Попробуй:

 where "Refinancecount" >= 1 and "Inschoolcount" >= 1
 

Кстати, вы можете написать этот запрос без внутреннего запроса, используя having предложение:

 select
        user_id
from
        loans
group by 1
having sum(case when type='Refinance' then 1 else 0 end) >=1 and sum(case when type='InSchool' then 1 else 0 end) >= 1
 

Ответ №2:

Да, сказано, что столбец Refinancecount не найден, потому что вам нужно использовать котировку where a."Refinancecount">=1 and a."Inschoolcount">=1 . Если вы назовете свой столбец «Inschoolcount», вам нужно указать на него»», в противном случае.Refinancecount будет преобразован в.refinancecount

Ответ №3:

Почему бы не сделать это просто так

  select
    user_id
     from
    loans
   group by user_id having
   sum(
        case
            when type in ('Refinance', 
             'InSchool') then 1 else 0 end >=2)