Как задать значение столбца из подзапроса COUNT, который соединяется с внешним запросом?

#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