2015-11-03 53 views
1
一行

我有SQL表看起来像:SQL从列转换数据为

name age apples banana kiwi 
mary 5 R3.00 null null 
mary 5 null null r6.00 
mary 5 null r9.50 null 
joane 8 null r9.60 null 
joane 8 r5.00 null null 

我需要将其转换为:

name age apples banana kiwi 
joane 8 r5.00 r9.60 (null) 
mary 5 R3.00 r9.50 r6.00 

我怎么做,这是SQL

+1

GROUP BY,例如MAX。如果玛丽有两种不同的新西兰价值观,你会怎么想? – jarlh

+0

是的,但是我怎样才能让水果在每个人的同一排上放? –

+0

玛丽将永远不会有2个不同的奇异值 –

回答

0

的名字尝试

select sum(age), sum(apples), sum(banana), sum(kiwi) from table group by name

+0

谢谢。如果列内的值不是兰德值,而是文本......我该怎么做? –

+0

'总和'年龄是个坏主意;) –

0

你应该组,并采取每个值的最小/最大

select 
    name, max(age) age, max(apples) apples, max(banana) banana, max(kiwi) kiwi 
from table group by name 
+0

谢谢。如果列内的值不是兰德值,而是文本......我该怎么做? –

+0

@MissR这样就可以了,为文本和数字值定义了'MAX'集合函数。 –

0

使用DISTINCT & NOT NULL在子查询中值是文本不是数字(所以SUM不会工作)。

SELECT DISTINCT yt.name, yt.age, 
(SELECT yta.apples FROM yourtable yta WHERE yta.name = yt.name AND yta.apples IS NOT NULL) AS apples, 
(SELECT ytb.banana FROM yourtable ytb WHERE ytb.name = yt.name AND ytb.banana IS NOT NULL) AS banana, 
(SELECT ytk.kiwi FROM yourtable ytk WHERE ytk.name = yt.name AND ytk.kiwi IS NOT NULL) AS kiwi 
FROM yourtable yt 

输出

name age apples banana kiwi 
joane 8 r5.00 r9.60 (null) 
mary 5 R3.00 r9.50 r6.00 

SQ FIDDLE:http://sqlfiddle.com/#!3/88bc53/11/0

注:也请考虑你的命名约定,无论是复数还是不是(苹果&猕猴桃/香蕉)。

+0

子查询在这里是多余的,我认为,我们可以通过聚合 –

+0

@ agent5566来做到这一点。可能它取决于在水果字段中填充了哪些其他数据。 – Matt