Группирование определенных строк в одну строку в sqlite

Sai Kumar спросил: 31 июля 2018 в 09:36 в: sql

Это запрос, который дал мне этот результат.

 SELECT
    country,
    COUNT(DISTINCT(customer_id)) total_customers
FROM customer c
GROUP BY 1
ORDER BY 2 DESC    country   total_customers1   India       2
2   Portugal    2
3   Argentina   1
4   Australia   1
5   Austria     1
6   Belgium     1
7   Chile       1

Как я могу сгруппировать все 1 в категорию Другие?

Желаемый вывод: страна клиенты

1   India       2
2   Portugal    2
3   Others      5

4 ответа

Есть решение
Gordon Linoff ответил: 31 июля 2018 в 10:17

Используйте case и group by дважды:

select (case when total_customers = 1 then 'Others' else country end) as country,
       sum(total_customers) as customers
from (select country,
             count(distinct customer_id) as total_customers
      from customer c
      group by country
     ) c
group by (case when total_customers = 1 then 'Others' else country end);
Sai Kumar ответил: 31 июля 2018 в 10:00
Можете ли вы сказать мне, где я могу использовать его в моем коде. Выдает ошибку, используя этот код выше no such column as customers
Gordon Linoff ответил: 31 июля 2018 в 10:18
@ sai_636. , , Это потому, что он ответил на ваш первоначальный вопрос.
Yogesh Sharma ответил: 31 июля 2018 в 10:27

Вам нужно case с предложением group by:

select (case when customers = 1 then 'Others' else country end) country,
       sum(customers) customers
from table t
group by (case when customers = 1 then 'Others' else country end);

EDIT: Например, предыдущий запрос будет реализован с помощью подзапроса.

Но для этого вы можете сделать:

select (case when country in ('India','Portugal') then country else 'others' end) as country,
       count(distinct customer_id) as customers
from table t
group by (case when country in ('India','Portugal') then country else 'others' end)
Sai Kumar ответил: 31 июля 2018 в 10:04
Выдает ошибку no such column: customers
Yogesh Sharma ответил: 31 июля 2018 в 10:05
@ Sai_636. , , Просто опечатка исправлена.
Sai Kumar ответил: 31 июля 2018 в 10:07
У меня больше ценностей в другой стране, чем в Индии, в Португалии. Я включил только те два для демо в вопросе? Что я могу сделать?
sticky bit ответил: 31 июля 2018 в 10:18

Вы должны поместить свой запрос в другой запрос для повторного агрегирования. GROUP BY a CASE, который возвращает страну или 'Other' на основе количества. ORDER BY становится немного сложнее, так как вам придется использовать в нем вышеупомянутый случай, чтобы отсортировать Others после всех других стран. Сначала проверьте, возвращает ли CASE 'Others', затем возвращает более высокое значение, иначе более низкое. Затем выполните сортировку по CASE.

Это должно выглядеть примерно так:

SELECT CASE x.total_customers
         WHEN 1 THEN
           'Others'
         ELSE
           x.country
       END country,
       sum(total_customers) total_customers
       FROM (SELECT c.country,
                    count(DISTINCT c.customer_id) total_customers
                    FROM customer c
                    GROUP BY c.country) x
       GROUP BY CASE x.total_customers
                  WHEN 1 THEN
                    'Others'
                  ELSE
                    x.country
                END
       ORDER BY CASE
                  WHEN CASE x.total_customers
                         WHEN 1 THEN
                           'Others'
                         ELSE
                           x.country
                        END = 'Others' THEN
                    1
                  ELSE
                    -1
                END,
                CASE x.total_customers
                  WHEN 1 THEN
                    'Others'
                  ELSE
                    x.country
                END;

(не проверено, поскольку не предоставлены DDL или образцы данных .)

fa06 ответил: 31 июля 2018 в 09:40

Попробуйте это:

select case when customers not in ('India',
'Portugal') then 'Others' else country end as country,
       sum(customers) as customers
from t
group by case when customers not in ('India',
'Portugal') then 'Others' else country end