使用SQL Server中单行中的列转换多行

时间:2018-01-01 06:06:55

标签: sql sql-server merge

在SQL Server中,我们有40条记录,包含15列。我想将所有这些记录合并为一列,即1行中40 * 15 = 600列。

例如,样本表有几条记录:

sn    Name  city  cntry  conti
------------------------------
1     abc   NYC   USA    NA
2     def   LON   UK     EU
3     xyz   DUB   UAE    ASIA

然后合并所有记录&进入一个记录然后它应该如下:

sn    Name  city  cntry  conti  sn    Name  city  cntry  conti  sn    Name  city  cntry  conti  
1     abc   NYC   USA    NA     2     def   LON   UK     EU     3     xyz   DUB   UAE    ASIA

2 个答案:

答案 0 :(得分:3)

你可以试试这个。

DECLARE @SqlText  NVARCHAR(MAX) = 'SELECT * FROM MyTable T1 '

SELECT @SqlText  = @SqlText  + ' INNER JOIN MyTable AS T'+ CONVERT(VARCHAR, sn) +' ON T'+CONVERT(VARCHAR, sn) +'.sn =  ' + CONVERT(VARCHAR, sn) 
FROM MYTable WHERE sn > 1
order by sn 

SET @SqlText  = @SqlText  + ' WHERE T1.sn = 1'

EXEC ( @SqlText )

生成此查询作为结果。

SELECT * FROM MyTable T1  
     INNER JOIN MyTable AS T2 ON T2.sn =  2 
     INNER JOIN MyTable AS T3 ON T3.sn =  3
 WHERE T1.sn = 1

结果:

sn          Name       city       cntry      conti      sn          Name       city       cntry      conti      sn          Name       city       cntry      conti
----------- ---------- ---------- ---------- ---------- ----------- ---------- ---------- ---------- ---------- ----------- ---------- ---------- ---------- ----------
1           abc        NYC        USA        NA         2           def        LON        UK         EU         3           xyz        DUB        UAE        ASIA

答案 1 :(得分:1)

请求看起来很奇怪,但这是使用dynamic sql

执行此操作的一种方法
IF ( Object_id('tempdb..#Table1') IS NOT NULL )
  DROP TABLE #Table1

CREATE TABLE #Table1
  (
     [sn]    INT,
     [Name]  VARCHAR(3),
     [city]  VARCHAR(3),
     [cntry] VARCHAR(3),
     [conti] VARCHAR(4)
  );

INSERT INTO #Table1
            ([sn],[Name],[city],[cntry],[conti])
VALUES      (1,'abc','NYC','USA','NA'),
            (2,'def','LON','UK','EU'),
            (3,'xyz','DUB','UAE','ASIA');

DECLARE @col_list VARCHAR(max)=''

SELECT @col_list = Stuff((SELECT ',sn = max(case when sn = '
                                 + Cast(sn AS VARCHAR(50))
                                 + ' then sn end), Name = max(case when sn = '
                                 + Cast(sn AS VARCHAR(50))
                                 + ' then name end), city = max(case when sn = '
                                 + Cast(sn AS VARCHAR(50))
                                 + ' then city end), cntry = max(case when sn = '
                                 + Cast(sn AS VARCHAR(50))
                                 + ' then cntry end), conti = max(case when sn = '
                                 + Cast(sn AS VARCHAR(50))
                                 + ' then conti end)'
                          FROM   #Table1
                          ORDER  BY sn
                          FOR xml path('')), 1, 1, '')

EXEC('select '+@col_list+' from #Table1') 

结果:

+----+------+------+-------+-------+----+------+------+-------+-------+----+------+------+-------+-------+
| sn | Name | city | cntry | conti | sn | Name | city | cntry | conti | sn | Name | city | cntry | conti |
+----+------+------+-------+-------+----+------+------+-------+-------+----+------+------+-------+-------+
|  1 | abc  | NYC  | USA   | NA    |  2 | def  | LON  | UK    | EU    |  3 | xyz  | DUB  | UAE   | ASIA  |
+----+------+------+-------+-------+----+------+------+-------+-------+----+------+------+-------+-------+