Строки sql group по столбцам

У меня есть таблица:

ID Status Date
1 Stop 01.01.2001
1 Run 02.01.2002
2 Stop 03.01.2003
2 Run 04.01.2004

и я хотел бы группировать строки следующим образом:

ID Stop Run
1 01.01.2001 02.01.2002
2 03.01.2003 04.01.2004

Каков наилучший способ сделать эту группу?

3 ответа

select id, max(case when status = 'Stop' then date end) as stop, max(case when status = 'Run' then date end) as run
from your_table
group by id


С помощью

Функция PIVOT ORACLE

то же самое можно сделать, используя следующий запрос:

SELECT *
FROM (SELECT ID,dateval,action FROM my_table)
PIVOT (max(dateval) FOR (action) IN ('Stop' AS STOP, 'Run' AS RUN));

QUERY WITH TEST DATA:

with my_table as
(
select 1 id, 'Stop' action, '01.01.2001' dateval from dual
union
select 1 id, 'Run' action, '02.01.2002' dateval from dual
union
select 2 id, 'Stop' action, '03.01.2003' dateval from dual
union
select 2 id, 'Run' action, '04.01.2004' dateval from dual
)
SELECT *
FROM (SELECT ID,dateval,action FROM my_table)
PIVOT (max(dateval) FOR (action) IN ('Stop' AS STOP, 'Run' AS RUN));


Используйте следующий запрос, чтобы получить результат, используя

CASE и GROUP BY

select ID, MIN(case when action = 'Stop' then dateval end) STOP, MIN(case when action = 'Run' then dateval end) RUN
from my_table
group by id;

Чтобы использовать GROUP BY, вам нужно использовать некоторую агрегированную функцию. Таким образом, вы можете использовать MIN или MAX

QUERY WITH TEST DATA:

with my_table as
( select 1 id, 'Stop' action, '01.01.2001' dateval from dual union select 1 id, 'Run' action, '02.01.2002' dateval from dual union select 2 id, 'Stop' action, '03.01.2003' dateval from dual union select 2 id, 'Run' action, '04.01.2004' dateval from dual
)
select ID, MIN(case when action = 'Stop' then dateval end) STOP, MIN(case when action = 'Run' then dateval end) RUN
from my_table
group by id

licensed under cc by-sa 3.0 with attribution.