#sql #vertica
#sql #vertica
Вопрос:
У меня есть запрос (изначально написанный для SQL Server), который содержит несколько подзапросов в качестве столбцов, которые вычисляют количество. В SQL server я могу иметь уравнение, чтобы для столбца был установлен подзапрос count, например:
Pass = (select count(*) from report.sub_2018 p where p.ABST = a.ABST and p.RESULT = 'P' and p.STATUS_REASON = 'Pending' and p.MONTH_YEAR = a.MONTH_YEAR)
Я пытаюсь запустить запрос в Vertica, но он не допускает такого типа «уравнения». Итак, я попытался сделать что-то вроде
(select count(*) from report.sub_2018 p where p.ABST = a.ABST and p.RESULT = 'P' and p.STATUS_REASON = 'Pending' and p.MONTH_YEAR = a.MONTH_YEAR) as Pass
но поскольку он связан с внешним запросом, я получаю сообщение об ошибке Correlated subquery with aggregate function COUNT is not supported
Это мой запрос:
select UserId = u.USER_ID,
Name = u.LNAME ', ' u.FNAME,
a.Month_Year,
(select count(*) from report.sub_2018 p where p.ABST = a.ABST and p.RESULT = 'P' and p.STATUS_REASON = 'Pending' and p.MONTH_YEAR = a.MONTH_YEAR) as Pass,
(select count(*) from report.sub_2018 p where p.ABST = a.ABST and p.RESULT = 'F' and p.STATUS_REASON = 'Pending' and p.MONTH_YEAR = a.MONTH_YEAR) as Fail,
(select count(*) from report.sub_2018 p where p.ABST = a.ABST and p.STATUS_REASON = 'Pending' and p.MONTH_YEAR = a.MONTH_YEAR) as Total
from report.sub_2018 a inner join pd_user_info u on a.ABST = u.USER_ID
where MONTH_YEAR like '2018-%' and u.USER_ID like 'MMN%'
group by u.LNAME, u.FNAME, a.MONTH_YEAR, a.ABST, u.USER_ID
order by u.LNAME, u.FNAME, a.MONTH_YEAR
Я не слишком уверен, как изменить запрос, чтобы он работал с внешним запросом с таблицей report.sub_2018 a
Любая помощь приветствуется!
Ответ №1:
Вместо этого напишите этот запрос
select
u.USER_ID as UserId,
u.LNAME || ', ' || u.FNAME as Name,
a.Month_Year,
count(case when a.RESULT = 'P' and a.STATUS_REASON = 'Pending' then 1 end) as Pass,
count(case when a.RESULT = 'F' and a.STATUS_REASON = 'Pending' then 1 end) as Fail,
count(case when a.STATUS_REASON = 'Pending' then 1 end) as Total
from report.sub_2018 a
inner join pd_user_info u on a.ABST = u.USER_ID
where MONTH_YEAR like '2018-%' and u.USER_ID like 'MMN%'
group by u.LNAME, u.FNAME, a.MONTH_YEAR, a.ABST, u.USER_ID
order by u.LNAME, u.FNAME, a.MONTH_YEAR
Таким образом, вам нужно получить доступ к sub_2018
таблице только один раз. Недавно я писал в блоге об этой технике.
Обратите внимание также, что в большинстве других баз данных, отличных от SQL Server, псевдоним столбца выполняется с использованием этого синтаксиса
u.USER_ID as UserId
… не этот конкретный SQL Server:
UserId = u.USER_ID