2015-07-03 65 views
0

我想合并数据表中的行与财产以后这样的数据数据行合并在SQL

A Ar 1 3 A Ab 3 4 B Bl 3 5 B Bk 5 2 M Mj 4 5

到数据表像这样

A Ar 1 3 Ab 3 4 
B Bl 3 5 Bk 5 2 
M Mj 4 5 Null Null Null 

有任何TSQL statment做到这一点的?

+0

是可能的列的组数限制为2组(6个COLS),或者可以有多于2行用于'A',2排为'乙',等等,需要一个未知数量的输出列? –

+0

Michael Berkowski它只有2行,列数是6列 – Afshin

+0

你需要哪个版本的sqlserver?如果你正在使用SQL 2012,那么有一个很好的解决方案。 –

回答

0

这很简单,因为它的变量有限。第一部分是设置临时表,因为我不知道你的列名或任何东西。

select 'a' 'c1', 'ar' 'c2', '1' 'c3', '3' 'c4' 
into #temp 
union select 'a' 'c1', 'ab' 'c2', '3' 'c3', '4' 'c4' 
union select 'b' 'c1', 'bl' 'c2', '3' 'c3', '5' 'c4' 
union select 'b' 'c1', 'bk' 'c2', '5' 'c3', '2' 'c4' 
union select 'm' 'c1', 'mj' 'c2', '4' 'c3', '5' 'c4' 


select * 
from #temp t1 
left join #temp t2 
on t1.c1 = t2.c1 
and t1.c2 != t2.c2 
where t1.c2 = (select MAX(c2) from #temp where #temp.c1 = t1.c1) 


c1 c2 c3 c4 c1  c2  c3  c4 
m mj 4 5 NULL NULL NULL NULL 
b bl 3 5 b  bk  5  2 
a ar 1 3 a  ab  3  4 
0

尝试:

--create temp table for OP data sample 
DECLARE @YourData AS TABLE 
    (
     C1 VARCHAR(1) , 
     C2 VARCHAR(2) , 
     C3 INT , 
     C4 INT 
    ) 
INSERT @YourData 
     (C1, C2, C3, C4) 
VALUES ('A', 'Ar', 1, 3), 
     ('A', 'Ab', 3, 4), 
     ('B', 'Bl', 3, 5), 
     ('B', 'Bk', 5, 2), 
     ('M', 'Mj', 4, 5) 
--final query 
;WITH cte 
      AS (SELECT C1 , 
         C2 , 
         C3 , 
         C4 , 
         ROW_NUMBER() OVER (PARTITION BY C1 ORDER BY C2) AS RN 
       FROM  @YourData 
      ) 
    SELECT c1.C1 , 
      c1.C2 , 
      c1.C3 , 
      c1.C4 , 
      c2.C1 , 
      c2.C2 , 
      c2.C3 , 
      c2.C4 
    FROM cte AS c1 LEFT JOIN cte AS c2 ON c1.C1 = c2.C1 AND c2.RN > 1 
    WHERE c1.rn = 1