2013-07-20 2 views

ответ

2

Я хотел бы предложить вам сделать это с помощью 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; 

В таком случае, я хотел бы также добавить столбец для количества сред, а также.

+0

Я не знаю, сколько столбцов будет. Например, если есть еще данные, птица, которая живет в море, воде и небе, нужна колонка3. Как мне это сделать. Неужели это невозможно? Что делать, если возникло такое требование? –

+0

Я не забочусь о заказе, его действительно неважно для меня! Спасибо –

+0

сделайте это полужирным ** SQL-запросы должны возвращать фиксированное количество столбцов. Вы не можете иметь запрос, иногда возвращающий три столбца, а иногда и четыре ** –

1

Ваш код вводит в заблуждение; что '-----' должен был показывать мне?

У вас есть повторяющиеся значения и ваше право хотеть «группировать» их. Взгляните на нормализацию, поскольку вы, похоже, участвуете в уровне схемы базы данных и запрашиваете DDL code. https://en.wikipedia.org/wiki/Database_normalization

Если первые две «------» фактически представляют собой две таблицы, я бы предложил следующую доработку этой схемы.

Animal Environment Animal_Environment 
------ ------   ------ 
id  id    animal_id 
name  name   environment_id 

С этим мы избегаем повторения содержимого в нашей базе данных. Также приводит к простому DML queries для этого контента.

+0

---- ничего, но разделение имени столбца от значений. И я думаю, что таблица имеет нормализованную структуру. Но мое требование может быть немного странным. –

+0

Это не две таблицы. Это две колонки.Спасибо –

+0

@ t-clausen Я делаю, иди рыбу. – wurde

1

Это не совсем то, что вы просили, но это еще один способ ее решения:

declare @t table(Animal varchar(10), LiveIn varchar(7)) 
insert @t values 
('Cat','land'),('fish','water'),('frog','land'), 
('frog','water'),('salamander','land'),('salamander','water') 

select * from @t 
PIVOT 
(min([LiveIn]) 
FOR Livein 
in([land],[water]) 
)AS p ORDER BY 1 

Результат:

Animal  land Water 
______________________ 
Cat  land NULL 
fish  NULL water 
frog  land water 
salamander land water 
+0

Говорить, что таблица не является нормированной. См. Ответ @wurde. Кто-то поддержал его. Я не знаю, что я совершил. Я считаю, что таблица нормализована. Иногда мое требование может быть странным. –

Смежные вопросы