Как группировать по строкам в разных колонках - PullRequest
0 голосов
/ 11 марта 2020

У меня есть эта таблица в SQL, мне нужно сгруппировать ее по имени отчета, и мне нужно разделить столбец price_bucket и столбец count_sales на строки разного.

+-----------+-------------+--------------+--------------------+-------------+--+
| report_id | report_name | order_number | price_bucket_range | count_sales |  |
+-----------+-------------+--------------+--------------------+-------------+--+
|        69 | London      |            1 | 0 - 1              |           4 |  |
|        69 | London      |            2 | 1 - 2              |           8 |  |
|        69 | London      |            3 | 2 - 3              |           2 |  |
|        69 | London      |            4 | 3 - 4              |           2 |  |
|        69 | London      |            5 | 4 - 1000           |           0 |  |
|        70 | Berlin      |            1 | 0 - 1              |          11 |  |
|        70 | Berlin      |            2 | 1 - 2              |           3 |  |
|        70 | Berlin      |            3 | 2 - 3              |           2 |  |
|        70 | Berlin      |            4 | 3 - 4              |           1 |  |
|        70 | Berlin      |            5 | 4 - 1000           |           1 |  |
|        71 | Paris       |            1 | 0 - 2              |           5 |  |
|        71 | Paris       |            2 | 2 - 3              |          17 |  |
|        71 | Paris       |            3 | 3 - 5              |           6 |  |
|        71 | Paris       |            4 | 5 - 10             |           0 |  |
|        71 | Paris       |            5 | 10 - 1000          |           1 |  |
+-----------+-------------+--------------+--------------------+-------------+--+

Я думаю, что я следует использовать функцию PIVOT в SQL Сервер и промежуточную таблицу. Как мне это сделать?

Вот так должна выглядеть финальная таблица:

| report_id | report_name | price_bucket_1 | count_sales_1 | price_bucket_2 | count_sales_2 | price_bucket_3 | count_sales_3 | price_bucket_4 | count_sales_4 | price_bucket_5 | count_sales_5 |
+-----------+-------------+----------------+---------------+----------------+---------------+----------------+---------------+----------------+---------------+----------------+---------------+
|        69 | London      | 0 - 1          |             4 | 1 - 2          |             8 | 2 - 3          |             2 | 3 - 4          |             2 | 4 - 1000       |             0 |
|        70 | Berlin      | 0 - 1          |            11 | 1 - 2          |             3 | 2 - 3          |             2 | 3 - 4          |             1 | 4 - 1000       |             1 |
|        71 | Paris       | 0 - 2          |             5 | 2 - 3          |            17 | 3 - 5          |             6 | 5 - 10         |             0 | 10 - 1000      |             1 |
+-----------+-------------+----------------+---------------+----------------+---------------+----------------+---------------+----------------+---------------+----------------+---------------+


Дополнительная информация: в столбце order_number иногда будет 5 строк, а иногда - 4. В этом Если в последних 2 столбцах должно быть 0. Но не более 5 строк.

Большое спасибо за помощь.

1 Ответ

2 голосов
/ 11 марта 2020

Если я правильно понимаю, вам нужно перечислить сегменты в порядке убывания продаж. Вы можете использовать row_number() и условное агрегирование:

select report_id, report_name,
       max(case when seqnum = 1 then price_bucket_range end) as bucket_1,
       max(case when seqnum = 1 then count_sales end) as count_1,
       max(case when seqnum = 2 then price_bucket_range end) as bucket_2,
       max(case when seqnum = 2 then count_sales end) as count_2,
       max(case when seqnum = 3 then price_bucket_range end) as bucket_3,
       max(case when seqnum = 3 then count_sales end) as count_3,
       max(case when seqnum = 4 then price_bucket_range end) as bucket_4,
       max(case when seqnum = 4 then count_sales end) as count_1,
       max(case when seqnum = 5 then price_bucket_range end) as bucket_5,
       max(case when seqnum = 5 then count_sales end) as count_5
from (select t.*,
             row_number() over (partition by report_id order by count_sales desc) as seqnum
      from t
     ) t
group by report_id, report_name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...