Преобразовать несколько строк в один ряд с несколькими столбцами - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь выяснить, как создать запрос SQL, который может вернуть одну агрегированную строку с несколькими столбцами на основе другой таблицы с несколькими строками. Для начала у меня будет довольно большая таблица с миллионами строк с данными заказа, где у меня для одного item_id может быть одна строка с валютой USD и одна строка с валютой EUR. Для каждой строки у меня также будут дополнительные данные, например, number_of_items. Эта таблица будет выглядеть примерно так:

Item_id Currency    Value   Nbr_of_items    Total_nbr_of_items  Item_share 
1   USD 200 100 200 0,50
1   EUR 40  20  200 0,10
1   CNY 35  80  200 0,40
2   HKD 50  60  100 0,60
2   GBP 20  40  100 0,40
3   CNY 14  50  50  1,00
4   USD 10  30  30  1,00

Моя конечная цель - создать одну таблицу с одной строкой для каждого item_id, которая может содержать до 3 разных валют. Следующая таблица - это то, что я хотел бы создать, но не уверен, как бы я это сделал ... Есть идеи? Буду очень признателен за вашу помощь!

РЕДАКТИРОВАТЬ: просто обновил таблицу, так как я хотел бы иметь валюты в заказе на основе item_share, поэтому самый большой item_share должен быть currency_1, второй по величине item_share должен быть currency_2 et c.

Item_id Currency_1  Value_1 Nbr_of_items_1  Currency_2  Value_2 Nbr_of_items_2  Currency_3  Value_3 Nbr_of_items_3
1   USD 200 100 CNY 35  80  EUR 40  20
2   HKD 50  60  GBP 20  40  NULL    NULL    NULL
3   CNY 14  50  NULL    NULL    NULL    NULL    NULL    NULL
4   USD 10  30  NULL    NULL    NULL    NULL    NULL    NULL

1 Ответ

0 голосов
/ 02 апреля 2020

Можно использовать row_number() и условное агрегирование:

select item_id,
       max(case when seqnum = 1 then currency end) as currency_1,
       max(case when seqnum = 1 then value end) as value_1,
       max(case when seqnum = 1 then num_items end) as num_items_1,
       max(case when seqnum = 2 then currency end) as currency_2,
       max(case when seqnum = 2 then value end) as value_2,
       max(case when seqnum = 2 then num_items end) as num_items_2,
       max(case when seqnum = 3 then currency end) as currency_3,
       max(case when seqnum = 3 then value end) as value_3,
       max(case when seqnum = 3 then num_items end) as num_items_3
from (select t.*,
             row_number() over (partition by item_id order by num_items desc) as seqnum
      from t
     ) t
group by item_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...