2015-05-22 157 views
1

我有一个表像下面:合并多行到一行在SQL

ID TYPE VALUE 
    1 CC 1  X 
    1 CC 2  Y 
    1 CC 3 NULL 
    1 CC 4 NULL 

我使用SQL PIVOT和东西的功能得到期望的结果,但仍然没能做到这一点。请任何人都可以帮助我。

所需的结果:

ID [CC 1] [CC 2] [CC 3] [CC 4] 
1 X  Y  NULL NULL 
+0

“type”值是否修复? –

+0

http://stackoverflow.com/questions/24470/sql-server-pivot-examples –

+0

@juergend可能是..但这些是在一个特定的Id循环。假设对于Id 1,这些都是13,然后是2等等。 – vivek

回答

0

FULL OUTER JOIN的:

select coalesce(t1.id, t2.id, t3.id, t4.id), 
     t1.value as cc1, 
     t2.value as cc2, 
     t3.value as cc3, 
     t4.value as cc4 
from (select id, value from tablename where type = 'CC 1') as t1 
    full outer join (select id, value from tablename 
        where type = 'CC 2') as t2 ON t1.id = t2.id 
    full outer join (select id, value from tablename 
        where type = 'CC 3') as t3 ON t2.id = t3.id 
    full outer join (select id, value from tablename 
        where type = 'CC 4') as t ON t3.id = t4.id 
3

您可以通过多种方式接近这一点。我通常使用条件聚集:

select id, 
     max(case when type = 'CC 1' then value end) as cc1, 
     max(case when type = 'CC 2' then value end) as cc2, 
     max(case when type = 'CC 3' then value end) as cc3, 
     max(case when type = 'CC 4' then value end) as cc4 
from <table t> 
group by id; 
+0

我们可以使用东西还是透视这个..换句话说,我希望使用东西或透视。所以请如果你能帮助我.. – vivek

+0

@vivek。 。 。我使用条件聚合的原因是(1)它适用于所有数据库,并且(2)由于表中的其他列而产生意外结果。我不知道为什么这个查询需要'stuff()'。 –

0

尝试以下操作:

Select id, listagg(value, '-') within group(order by type) over (partition by id) as txt 
From table group by Id, txt 
0

这里是支点的语法;

SELECT ID, [CC 1],[CC 2],[CC 3],[CC 4] 
FROM yourtable 
PIVOT 
(min([value]) 
FOR Type 
in([CC 1],[CC 2],[CC 3],[CC 4]) 
)AS p