SQL Select с регистром - выберите в несколько групп

У меня есть список стран и столбцы нормализованного дохода следующим образом:

  country income
  --------------
  es    500
  gb    200
  sg    300
  id    500
  de    450

То, что я пытаюсь сделать здесь, - это разбить страны на различные географические регионы и глобальный регион.

Регион ЕС будет содержать es (Испания), gb (Великобритания) и de (Германия). Азиатский регион будет содержать sg (Сингапур) и id (Индонезия)

Теперь я также хочу добавить каждую страну в глобальный географический регион, чтобы глобальный регион содержал все перечисленные выше страны.

Таким образом, это приведет к тому, что es (Испания) попадет под ЕС и Глобальный

Точно так же id (Индонезия) подпадает под Азию и Глобальный

Итоговая таблица будет выглядеть так:

   region    country income
   -------------------------
   EU        es    500
   EU        gb    200
   ASIA      sg    300
   ASIA      id    500
   EU        de    450
   Global    es    500
   Global    gb    200
   Global    sg    300
   Global    id    500
   Global    de    450

Я думал о чем-то вроде заявления CASE

SELECT
    CASE WHEN country IN ('es', 'gb', 'de') 
            THEN 'EU'
         WHEN country IN ('id', 'sg') 
            THEN 'ASIA'

Но я не уверен, как получить глобальную группу отсюда. Это не должно быть сделано с помощью оператора CASE - открыт для предложений.

2 ответа

 SELECT
    CASE when country in ('es', 'gb', 'de') THEN 'EU'
         when country in ('id', 'sg') THEN 'ASIA'
         END as Region, country,income FROM country

         UNION
 SELECT 'Global',country,income 
          FROM country

Я бы сделал это с групповым назначением:

select reg.region, reg.country, income
from country c join
     (select 'es' as country, 'EU' as region union all
      select 'gb' as country, 'EU' as region union all
      select 'de' as country, 'EU' as region union all
      select 'id' as country, 'EU' as region union all
      select 'sg' as country, 'EU' as region union all
      select 'es' as country, 'GLOBAL' as region union all
      select 'gb' as country, 'GLOBAL' as region union all
      select 'de' as country, 'GLOBAL' as region union all
      select 'id' as country, 'GLOBAL' as region union all
      select 'sg' as country, 'GLOBAL' as region
     ) as reg
     on c.country = reg.country;

Я был бы склонен поместить отображение страны / региона в отдельную таблицу.

Другие вопросы по тегам