SQL группируется по запросу. заполнитель - PullRequest
0 голосов
/ 31 октября 2019

Можете ли вы помочь мне с группой по запросу. У меня есть таблица, как показано ниже

Country State      SomeType
UK      England    Yes
UK      Wales      No
UK      Scotland   MayBe
Germany Bavaria    Yes
Germany Bremen     Yes

Мне нужно пометить каждую страну как Да, Нет, MayBe или Смешанный тип.

Если для всех штатов выбрано «Да», то эта страна будет «Да», «Все Нет», тогда эта страна будет «Нет». Если все страны являются «MayBe», то эта страна будет «MayBe». Но если разные штаты имеют разные SomeType, то они должны быть помечены как «Смешанные».

В вышеприведенном случае я должен получить вывод в виде

Country Type
UK      Mixed
Germany Yes

Это просто выдуманный пример, поскольку я не могу привести здесь реальные требования. Извините, если кто-то возражает против того, чтобы называть Уэльс штатом, а не страной.

Ответы [ 4 ]

1 голос
/ 31 октября 2019

Можно перейти к агрегации:

select country, (case when count(distinct sometype) > 1 
                      then 'mixed' 
                      else max(sometype)
                 end) as Type
from table t
group by country;
1 голос
/ 31 октября 2019

demo: db <> fiddle

Вы можете использовать агрегацию массива с array_agg(), а затем проверять значения массива с помощью оператора ALL:

SELECT
    country,
    CASE 
        WHEN 'Yes' = ALL(array_agg(some_type)) THEN 'Yes' 
        WHEN 'No' = ALL(array_agg(some_type)) THEN 'No'
        ELSE 'Mixed' 
    END as type
FROM mytable
GROUP BY country
0 голосов
/ 31 октября 2019

Вы можете использовать case..when выражение с агрегацией:

select country, 
       case when sum(case when sometype = 'Yes' then 1 end)=count(*) then max(sometype)
            when sum(case when sometype = 'No' then 1 end)=count(*) then max(sometype)
            when sum(case when sometype = 'MayBe' then 1 end)=count(*) then max(sometype)  
            else
               'Mixed'  
            end as type
  from tab
 group by country

Демо

0 голосов
/ 31 октября 2019

Вы можете использовать агрегацию и условное выражение:

select 
    country,
    case 
        when count(*) filter(where sometype = 'No') = 0 then 'Yes'
        when count(*) filter(where sometype = 'Yes') = 0 then 'No'
        else 'Mixed'
    end "type"
from mytable
group by country
...