Группировать по пункту where - PullRequest
1 голос
/ 10 января 2020

Это мои входные данные

Num             Type          Code
121526s206      FFSv          2
121526s206      MEDI          3
121526s206      MEDI          4

Это мой запрос -

select num, code, count(*)
from pay
where code = 
      case when code = '1' then '1'
      when code = '3' AND type IN ( 'FED', 'ASST', 'MED' ) then '1'
      when code = '2' then '2' 
      when code = '3' AND type IN ( 'MGD', 'MEDI' ) then '2'
end
group by num, code

Мой текущий вывод ниже. У него одна запись, потому что во входных данных есть один code 2.

Num          Code     Count
121526s206   2        1

Как получить этот вывод -

Num          Code     Count
121526s206   2        2

Я хочу подсчет будет 2, потому что я хочу, чтобы код 2 включал все записи с кодом 2 и все записи с code 3 и типом ( 'MGD', 'MEDI' ).

Ответы [ 3 ]

0 голосов
/ 11 января 2020

Вы используете подзапрос:

SELECT t.num, t.code, COUNT(*)
FROM (
  select num, 
      case when code = '1' then '1'
        when code = '3' AND type IN ( 'FED', 'ASST', 'MED' ) then '1'
        when code = '2' then '2' 
        when code = '3' AND type IN ( 'MGD', 'MEDI' ) then '2'
        ELSE code
      end AS code
  from pay) t
group by t.num, t.code
0 голосов
/ 11 января 2020

Группируйте по num и выражению CASE, которое изменит код в соответствии с вашими условиями:

select num, 
  case 
    when code = '3' AND type IN ( 'FED', 'ASST', 'MED' ) then '1'
    when code = '3' AND type IN ('MGD', 'MEDI') then '2'
    else code 
  end code, 
  count(*) counter
from pay
group by num, 
  case 
    when code = '3' AND type IN ( 'FED', 'ASST', 'MED' ) then '1'
    when code = '3' AND type IN ('MGD', 'MEDI') then '2'
    else code 
  end

См. demo (для SQL Сервер, но это стандарт SQL). Результаты:

> num        | code | counter
> :--------- | ---: | ------:
> 121526s206 |    2 |       2
> 121526s206 |    4 |       1

Для Mysql код может быть упрощен простым наложением псевдонима результата выражения CASE:

select num, 
  case 
    when code = '3' AND type IN ( 'FED', 'ASST', 'MED' ) then '1'
    when code = '3' AND type IN ('MGD', 'MEDI') then '2'
    else code 
  end newcode, 
  count(*) counter
from pay
group by num, newcode

См. demo .

0 голосов
/ 11 января 2020

Почему бы не взять дело в выбранную часть, как это:

select Code,  sum(case when code = 1 then 1
      when code = 3 AND type IN ( 'FED', 'ASST', 'MED' ) then 1
      when code = 2 then 2 
      when code = 3 AND type IN ( 'MGD', 'MEDI' ) then 2
      else 0 
end) as _Count  
from pay 
group by code having sum(case when code = 1 then 1
      when code = 3 AND type IN ( 'FED', 'ASST', 'MED' ) then 1
      when code = 2 then 2 
      when code = 3 AND type IN ( 'MGD', 'MEDI' ) then 2
      else 0 
end) > 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...