Как сгруппировать сложное состояние в sql - PullRequest
0 голосов
/ 05 августа 2020

Я хотел бы сгруппировать по region, где есть customers, у которых есть type=a

region customer type score
A       a        a     1
A       b        b     2
A       c        a     3 
B       d        c     4 
B       e        d     5 
C       f        a     6 
C       g        c     7

Поэтому после первого шага

region customer type score
A       a        a     1
A       b        b     2
A       c        a     3 
C       f        a     6 
C       g        c     7

И затем я группирую in region

region  sum(score)
A         6
C        13

также я хотел бы извлечь клиента, чей type=a

region customer type
A         a      a
A         c      a 
C         f      a

Затем я хотел бы объединить выше.

My желаемый результат выглядит следующим образом

customer sum_in_region
a           6
c           6
f          13 

Есть ли способ достичь этого?

Моя работа до второго шага .. Как я могу продолжить?

SELECT t1.region,t1.customer, t1.type, t1.score
  FROM yourTable t1
 WHERE EXISTS (SELECT 1
                 FROM yourTable t2
                WHERE t2.region = t1.region
                  AND t2.type = 'a');

Спасибо

Ответы [ 3 ]

2 голосов
/ 05 августа 2020

Присоедините таблицу к производной таблице, которая выполняет ваши первые два шага.

SELECT t3.customer,
       x1.score
       FROM yourtable t3
            INNER JOIN (SELECT t1.region,
                               sum(score) score
                               FROM yourtable t1
                                    WHERE EXISTS (SELECT *
                                                         FROM yourtable t2
                                                         WHERE t2.region = t1.region
                                                               AND t2.type = 'a')
                               GROUP BY t1.region) x1
                       ON x1.region = t3.region
       WHERE t2.type = 'a';
1 голос
/ 05 августа 2020

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

SQLFiddle

with country_tmp as
(SELECT t1.region,t1.customer, t1.type, t1.score
  FROM country t1
 WHERE EXISTS (SELECT 1
                 FROM country t2
                WHERE t2.region = t1.region
                  AND t2.type = 'a'))
                  select y.customer, x.score from
(select a.region, sum(a.score) score from (
SELECT t1.region,t1.customer, t1.type, t1.score
  FROM country_tmp t1) a
group by region) x , (SELECT t1.region,t1.customer, t1.type
  FROM country_tmp t1
 Where t1.type = 'a') y where x.region = y.region;
1 голос
/ 05 августа 2020

Вы можете использовать функции windows, чтобы получить результат; первый шаг фильтрует только строки с типом a в зависимости от региона. Затем на втором этапе вычисляется сумма баллов, снова основанная на регионе, перед выбором только столбцов «Клиент» и «Сумма»:

with filter_type_a as 
(select region, customer, type, score 
from
(select *,
sum(type=="a") over (partition by region) as counter
from your_table)
where counter > 0)

select customer, sum_region
from
(select customer, type,
sum(score) over (partition by region) as sum_region
from filter_type_a)
where type=="a";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...