2015-12-07 3 views
-1

Я хотел бы сделать запрос в базе данных postgres, чтобы получить значения в следующем формате. Таблица данныхКак выполнить вложенный запрос с использованием case

Name SEQ   CODE alert a alert b alert c 
1001 1564948409 1527643 Yes  No   No 
1001 1564948409 642270 Yes  No   No 
1003 1565646958 642270 No  Yes   No 
1004 1565484758 1359527 Yes  No   No 
1004 1565484758 502847 Yes  No   No 

я сгруппировал имя, последовательность, Alerta, alertb, alertc используя случай.

Select name, 
     count(distinct seq), 
     sum(case when alerta='Yes' then 1 else 0 end), 
     sum(case when alertb='Yes' then 1 else 0 end), 
     sum(case when alertc='Yes' then 1 else 0 end) 
From work_itemlist 
group by name 
order by name 

Теперь проблема в том, что я получаю поля предупреждений в виде суммы на основе элементов. Я хотел бы основываться на разных документах.

Теперь я получаю как

Name seq   alerta  alertb  alert c 
1001  1   2    0   0 
1003  1   0    1   0 
1004  1   2    0   0 

Но я хочу, как

Name seq   alerta  alertb  alert c 
1001  1   1   0   0 
1003  1   0   1   0 
1004  1   1   0   0 

Я попытался в следующий путь

Select name, 
     count(distinct seq), 
     sum(case when alerta='Yes' then count(distinct seq) else 0 end), 
     sum(case when alertb='Yes' then count(distinct seq) else 0 end), 
     sum(case when alertc='Yes' then count(distinct seq) else 0 end) 
From work_itemlist 
Group by name 
Order by name 

Но я получил ошибку синтаксиса говоря

агрегатные вызовы функций не могут быть вложенными

ответ

3

Если я правильно понимаю, просто использовать max() вместо sum():

select name, count(distinct seq), 
     max(case when alerta = 'Yes' then 1 else 0 end), 
     max(case when alertb = 'Yes' then 1 else 0 end), 
     max(case when alertc = 'Yes' then 1 else 0 end) 
from work_itemlist 
group by name 
order by name; 

EDIT:

Если вы хотите отчетливое SEQ для каждого имени в каждом группы, тогда ваш вопрос будет неясным. Но это легко сделать:

select name, count(distinct seq), 
     count(distinct case when alerta = 'Yes' then seq end), 
     count(distinct case when alertb = 'Yes' then seq end), 
     count(distinct case when alertc = 'Yes' then seq end) 
from work_itemlist 
group by name 
order by name; 
+0

Nope. Вы не понимали моего требования. Сожалею. Я хотел бы иметь различные значения, основанные на документе. Скажем, например, в порядке есть два кода, и если какой-либо один код или все коды имеют Да, тогда я должен получить результат как 1 else, я должен получить 0. В настоящее время мой запрос возвращает 2 вместо 1 –

+1

@ KathirvelAppusamy .. вы пробовали это вообще? это даст вам точный результат по мере необходимости. –

+0

Да. Это даст, но я этого не ожидал. Я приложил вышеуказанные данные к образцу, чтобы понять. На самом деле у меня будет много номеров для имени, в этом случае он всегда будет возвращать 1, он не будет возвращать фактический отчетный счет. Например, если имя 1005, имеющее 5 записей и среди 5, 3, является отличным, я должен получить 3. Ваш запрос вернется 1. Его не так, как ожидалось –

0

Попробуйте это:

Select name, count(distinct seq), count(DISTINCT case when alerta='Yes' then seq else null end), count(DISTINCT case when alertb='Yes' then seq else null end), count(DISTINCT case when alertc='Yes' then seq else null end) From work_itemlist Group by name Order by name

Смежные вопросы