SQL - 如何基于唯一值组合行

时间:2014-12-18 17:43:57

标签: sql sql-server string select unique

下表是从包含列ID,名称,器官和年龄的另一个表创建的。 “器官”栏中的值是指定器官和条件的代码。

使用CASE我做了一个这样的表:

--------------------------------------------------------
ID      NAME        Heart   Brain   Lungs   Kidneys AGE
1318    Joe Smith   NULL    NULL    NULL    NULL    50
1318    Joe Smith   NULL    NULL    NULL    NULL    50
1318    Joe Smith   NULL    NULL    NULL    Below   50
1318    Joe Smith   NULL    NULL    NULL    Below   50
1318    Joe Smith   NULL    NULL    Above   NULL    50
1318    Joe Smith   NULL    NULL    Above   NULL    50
1318    Joe Smith   Average NULL    NULL    NULL    50
1318    Joe Smith   Average NULL    NULL    NULL    50
--------------------------------------------------------

我想查询此表并获得以下结果:

--------------------------------------------------------
1318    Joe Smith   Average NULL    Above   Below   50   
--------------------------------------------------------

换句话说,我想根据每个记录的唯一值创建一个记录 列。

3 个答案:

答案 0 :(得分:4)

假设每个器官可以只有一个值或null,如示例数据所示,max聚合函数应该可以解决问题:

SELECT   id, name, 
         MAX(heart), MAX(brain), MAX(lungs), MAX(kidneys), 
         age
FROM     my_table
GORUP BY id, name, age

答案 1 :(得分:1)

    select id,name,heart=(select distinct(heart) from organ where id=1318 and heart is not null)
    ,brain= (select distinct(brain) from organ where id=1318 and brain is not null)
    ,lungs=(select distinct(lungs) from organ where id=1318 and lungs is not null)
    ,kidneys = (select distinct(kidneys) from organ where id=1318 and kidneys is not null)
    ,age from organ where id=1318

答案 2 :(得分:0)

您要在此处执行的操作是按ID和NAME汇总结果。这意味着每个唯一(ID,NAME)对只有一行。这可以使用GROUP BY关键字来实现。

现在,根据您使用的数据库(MySQL,DB2,...),此查询可能看起来有点不同,但您可以尝试这个:

SELECT 
   ID, NAME, 
   MAX(Heart), MAX(Brain), MAX(Lungs), MAX(Kidneys), MAX(AGE) 
FROM MYTABLE GROUP BY ID, NAME

这将为您提供每列的“最大”值。就像我说的,根据您的数据库,这可能不适用于字符串列,因此您也可以尝试COALESCE,它为您提供列表的第一个NOT NULL值:

SELECT 
   ID, NAME, 
   COALESCE(Heart), COALESCE(Brain), COALESCE(Lungs), COALESCE(Kidneys), COALESCE(AGE) 
FROM MYTABLE GROUP BY ID, NAME