#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)