-1

对于如下所示的表

Animal        LiveIn
------        ------

Cat           land
fish          water
frog          land
frog          water
salamander    land
salamander    water

我需要如下结果

Animal        Column1    Column2
------        -------    -------
cat           land       *null*
fish          water      *null*
frog          land       water
salamander    land       water
4

3 回答 3

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 表本质上是无序的。以上选择任意排序。如果您有idorCreatedAt列,则可以使用它来指定顺序。

鉴于没有排序,以下也做了等效的工作:

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;

编辑:

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;

在这种情况下,我还将添加一个环境数量列。

于 2013-07-20T10:45:19.830 回答
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
于 2013-07-20T16:18:30.430 回答
1

您的代码令人困惑;'-----' 应该向我展示什么?

你有重复的价值观和你想要“分组”它们的权利。看看规范化,因为您似乎参与了数据库的模式级别并要求DDL 代码https://en.wikipedia.org/wiki/Database_normalization

如果前两个“------”实际上是两个表,我建议对该模式进行以下返工。

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

这样我们就可以避免在我们的数据库中重复内容。还导致对该内容的更简单的DML 查询。

于 2013-07-20T10:48:23.780 回答