Как объединить строки с помощью оператора CASE - PullRequest
0 голосов
/ 19 октября 2019

У меня есть база данных с 58 клиентами (58 строк) со столбцом (страна). Как сгруппировать все строки, в которых страна появляется только один раз, и изменить ее имя на «Другое», используя оператор CASE

SELECT
    CASE
        WHEN (SELECT COUNT(country) FROM customer GROUP BY country)=1 THEN 'Other'
        ELSE country
    END country
FROM customer

Проблема заключается в том, что при выполнении запроса все страныстать другим. Я только хочу, чтобы страны, которые появляются однажды, назывались «Другие».

Ответы [ 3 ]

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

Вот как это сделать.

SELECT
CASE WHEN COUNT(country) = 1 THEN 'Other' ELSE country END
FROM customer
GROUP BY country;
0 голосов
/ 19 октября 2019

Для обновления фактической таблицы:

WITH map AS
  (SELECT country, 
          CASE WHEN COUNT(country) = 1 THEN 'Other'
               ELSE country END mapped
   FROM customer
   GROUP BY country) 
UPDATE customer
SET country = (SELECT mapped FROM map WHERE map.country = customer.country);
0 голосов
/ 19 октября 2019

С подзапросом, который подсчитывает, сколько раз страна появляется в таблице:

SELECT 
  CASE 
    WHEN (SELECT COUNT(*) FROM customer WHERE country = c.country) = 1 THEN 'Other' 
    ELSE c.country 
  END country 
FROM customer c

Или с присоединением таблицы к подзапросу, который возвращает все счетчики всех стран:

SELECT 
  CASE 
    WHEN g.counter = 1 THEN 'Other' 
    ELSE c.country 
  END country 
FROM customer c INNER JOIN (
  SELECT country, COUNT(*) counter 
  FROM customer 
  GROUP BY country
) g ON g.country = c.country

Если вы хотите, чтобы ваша таблица была сгруппирована по результату этого оператора CASE, используйте псевдоним, чтобы отличить ее от столбца таблицы country:

SELECT 
  CASE 
    WHEN (SELECT COUNT(*) FROM customer WHERE country = c.country) = 1 THEN 'Other' 
    ELSE c.country 
  END _country 
FROM customer c
GROUP BY _country
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...