Конвертировать строку в столбец в SQL - PullRequest
0 голосов
/ 22 марта 2019

Рассмотрим таблицу со схемой

orders(user int, amount int, created datetime);

С одной строкой = транзакция, и я хочу запросить группу данных транзакций по пользователю

например

User    First_Order_Amount    First_Order_DateTime Second_OrderAmount    Second_Order_DateTime
1       21                    2019-01-02           22                    2019-01-03
2       13                    2019-01-04           14                    2019-01-05

SQLСкрипка: https://www.db -fiddle.com / f / v4gZUMFbuYorB27AH9yBKy / 8

Ответы [ 3 ]

1 голос
/ 22 марта 2019

Если вы используете MySQL 8+, вы также можете использовать window functions вместо group by:

SELECT user, amount, created FROM
(SELECT * ,
ROW_NUMBER() OVER (PARTITION BY user ORDER BY user) AS rn
from orders) t
where t.rn = 1
0 голосов
/ 22 марта 2019

В MySQL 8+ вы можете использовать оконные функции и условное агрегирование:

select o.user,
       max(case when seqnum = 1 then amount end) as first_order_amount,
        max(case when seqnum = 1 then created end) as first_order_datetime,
       max(case when seqnum = 2 then amount end) as second_order_amount,
       max(case when seqnum = 2 then created end) as second_order_datetime
from (select o.*,
             row_number() over (partition by user order by created) as seqnum
      from orders o
     ) o
group by o.user;
0 голосов
/ 22 марта 2019

Для этого можно использовать вложенный запрос, например ::10000

SELECT o.user,
(SELECT o1.amount FROM orders o1 WHERE o1.user = o.user AND o1.created = (SELECT MIN(created) FROM orders WHERE user = o1.user)) AS first_order_amount,
(SELECT MIN(created) FROM orders o1 WHERE o1.user = o.user) AS first_order_datetime, 
(SELECT o1.amount FROM orders o1 WHERE o1.user = o.user AND o1.created = (SELECT MIN(created) FROM orders o1 WHERE o1.user = o.user AND o1.created > (SELECT MIN(created) FROM orders WHERE user = o1.user))) AS second_order_amount,
(SELECT MIN(created) FROM orders o1 WHERE o1.user = o.user AND o1.created > (SELECT MIN(created) FROM orders WHERE user = o1.user)) AS second_order_datetime
FROM orders o
GROUP BY o.user;

Вот SQL Fiddle .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...