Я хотел бы предложить вам сделать это с помощью row_number()
и условной агрегации:
select t.animal,
max(case when seqnum = 1 then livein end) as Column1,
max(case when seqnum = 2 then livein end) as Column2
from (select t.*, row_number() over (partition by animal order by (select NULL)) as seqnum
from t
) t
group by t.animal;
Обратите внимание, что вы не имеют возможности выразить упорядочение столбцов в данных. SQL-таблицы по своей сути неупорядочены. Вышеизложенное выбирает произвольный порядок. Если у вас есть столбец id
или CreatedAt
, вы можете использовать его для указания заказа.
Учитывая, что нет никакого заказа, следующий также делает эквивалентную работу:
select t.animal, min(t.LiveIn) as Column1,
(case when min(t.LiveIn) <> max(t.LiveIn) then max(t.LiveIn) end) as Column2
from t
group by t.animal;
EDIT:
SQL запросы должны возвращать фиксированное число столбцов. У вас не может быть запроса, иногда возвращающего три столбца, а иногда и четыре. Вы можете, однако, настроить запрос возвращает большее число столбцов, которые, как правило, может быть NULL
:
select t.animal, count(*) as NumLiveIn,
max(case when seqnum = 1 then livein end) as Column1,
max(case when seqnum = 2 then livein end) as Column2,
max(case when seqnum = 3 then livein end) as Column3,
max(case when seqnum = 4 then livein end) as Column4
from (select t.*, row_number() over (partition by animal order by (select NULL)) as seqnum
from t
) t
group by t.animal;
В таком случае, я хотел бы также добавить столбец для количества сред, а также.
Я не знаю, сколько столбцов будет. Например, если есть еще данные, птица, которая живет в море, воде и небе, нужна колонка3. Как мне это сделать. Неужели это невозможно? Что делать, если возникло такое требование? –
Я не забочусь о заказе, его действительно неважно для меня! Спасибо –
сделайте это полужирным ** SQL-запросы должны возвращать фиксированное количество столбцов. Вы не можете иметь запрос, иногда возвращающий три столбца, а иногда и четыре ** –