Запрос различного количества - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть таблица ниже:

 Item    Status1    Status2
-----------------------------
  A       Good       NULL
  A       Good       NULL
  A       Good       NULL
  A       Bad        Good

  B       Bad        Good
  B       Good       NULL

  C       Good       NULL
  C       Good       NULL      
  C       Good       NULL

  D       Bad        Good

Теперь я думаю о том, чтобы написать query, который дает мне следующий результат:

 Item     Good     Bad
-----------------------------
  A        4        1
  B        2        1
  C        3        0
  D        1        1

Отличается от предметастолбец и количество хороших и плохих для каждого предмета, где NULL не учитывается.

Имя столбца может быть любым (я просто сохранил его как хорошее и плохое во второй таблице).

Любые предложения / идеи о том, как достичь желаемых результатов?

Ответы [ 5 ]

0 голосов
/ 13 ноября 2018

Вы можете использовать подзапрос, а затем применить функцию суммы во внешнем запросе

select distinct(item) as item, sum(S1G+S2G) as Good,sum(S1B+S2B) as Bad from (  select item, CASE WHEN status1 ='Good' THEN 1 ELSE 0 END as S1G, CASE WHEN status2 ='Good' THEN 1 ELSE 0 END as S2G,  CASE WHEN status2 ='Bad' THEN 1 ELSE 0 END as S2B,  CASE WHEN status1 ='Bad' THEN 1 ELSE 0 END as S1B from t1 ) as b group by item

Вот демо

0 голосов
/ 13 ноября 2018

UNION не нужен, просто примените некоторую логику.

select Item
  ,sum(case when Status1 = 'Good' then 1 else 0 end +
       case when Status2 = 'Good' then 1 else 0 end) as good
  ,sum(case when Status1 = 'Bad' then 1 else 0 end +
       case when Status2 = 'Bad' then 1 else 0 end) as bad
from tab
group by Item

или

select Item
  ,count(case when Status1 = 'Good' then 1 end) +
   count(case when Status2 = 'Good' then 1 end) as good
  ,count(case when Status1 = 'Bad' then 1 end) +
   count(case when Status2 = 'Bad' then 1 end) as good
from tab
group by Item
0 голосов
/ 13 ноября 2018

Вы можете использовать объединение всех и условное агрегирование

select item, count(case when status1='good' then 1 end) as good,
count(case when status1='bad' then 1 end) as bad
from
(
select item , status1 from tablename
union all
select item , status2 from tablename
)A group by item
0 голосов
/ 13 ноября 2018

используйте объединение и случай, когда

select Item, sum(case when status = 'good' then 1 else 0 end) as good, 
 sum ( case when status = 'bad' then 1 else 0 end) as bad
from (select Item, Status1 as status
      from table_name
      union all
      select Item, Status2
      from table_name
     ) t
group by Item;
0 голосов
/ 13 ноября 2018

Использовать UNION ALL и делать агрегацию:

select item, sum(status = 'good'), sum(status = 'bad')
from (select item, status1 as status
      from table t
      union all
      select item, status2
      from table t
     ) t
group by item;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...