Как установить значение столбца из подзапроса COUNT, который соединяется с внешним запросом? - PullRequest
2 голосов
/ 16 апреля 2019

У меня есть запрос (изначально написанный для SQL Server), который имеет несколько подзапросов в виде столбцов, который вычисляет количество.В SQL-сервере у меня есть уравнение, в котором для столбца задан подзапрос 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 Ответ

2 голосов
/ 16 апреля 2019

Напишите этот запрос вместо

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
...