首页 > 解决方案 > 如何将数据从垂直放置的另一个表水平插入到一个表中?

问题描述

我目前在垂直放置的表格中有一个数据:

 FILE ID:        001                                                                                             
 RECORD 1        1111                                                                                                  
 RECORD 2        123456789012345                                                                                      
 RECORD 3        A01     11                                                                                                    
 RECORD 4        A02     11                                                                                                    
 RECORD 5        A03     11                                                                                                    
 RECORD 6                0103050                                                                                         
 RECORD 7                777                                                                                                   
 RECORD 8        A01     1                                                                                                     
 RECORD 9        A02     1                                                                                               
 RECORD 10       A03     1111                                                                                                  
 RECORD 11       A04     11111                                                                                                                                                                                                                                                                                              
 FILE ID:        002                                                                                             
 RECORD 1        2222                                                                                                  
 RECORD 2        1234567                                                                                    
 RECORD 3        A01     11                                                                                                    
 RECORD 4        A02     11                                                                                                    
 RECORD 5        A03     11                                                                                                    
 RECORD 6                0103050                                                                                       
 RECORD 7                777                                                                                                   
 RECORD 8        A01     1                                                                                                     
 RECORD 9        A02     1                                                                                                
 RECORD 10       A03     1111                                                                                                  
 RECORD 11       A04     11111                                                                                          
FILE ID:         003                                                                                            
 RECORD 1        3333                                                                                                  
 RECORD 2        1234567                                                                                     
 RECORD 3        A01     11                                                                                                    
 RECORD 4        A02     11                                                                                                    
 RECORD 5        A03     11                                                                                                    
 RECORD 6                0103050                                                                                         
 RECORD 7                777                                                                                                   
 RECORD 8        A01     1                                                                                                     
 RECORD 9        A02     1                                                                                                
 RECORD 10       A03     1111                                                                                                  
 RECORD 11       A04     11111   

如何将它插入到另一个表中,使其水平放置,方法如下:

FileID|Record1|Record2|Record3|Record4|Record5|Record6|Record7|Record8|Record9|Record10|Record11
--------------------------------------------------------------------------------------------------
001   |1111   |1111111|A01  11|A02  11|A03  11|0103050|777    |A01   1|A02   1|A03 1111|A04 11111
002   |2222   |1234567|A01  11|A02  11|A03  11|0103050|777    |A01   1|A02   1|A03 1111|A04 11111
003   |3333   |1234567|A01  11|A02  11|A03  11|0103050|777    |A01   1|A02   1|A03 1111|A04 11111

谢谢

标签: pivot-tablesql-server-2014sql-insert

解决方案


我参加聚会有点晚了,但我会试一试。仅当您的数据与文件 id 后跟 11 条记录一致时,这才有效。首先,您需要有一个带有标识列的表。在创建表格时,我会养成这样做的习惯。将您的批量插入下表。这将使用行 id 存储您的数据,这在以后很重要。

CREATE TABLE [dbo].[Table_1](
    [TableId] [bigint] IDENTITY(1,1) NOT NULL,
    [Column1] [varchar](255) NULL,
    [Column2] [varchar](255) NULL
) ON [PRIMARY]
GO

为透视数据创建此表。

CREATE TABLE [dbo].[Table_2](
    [Table2ID] [bigint] IDENTITY(1,1) NOT NULL,
    [FileID] [varchar](255) NULL,
    [Record1] [varchar](255) NULL,
    [Record2] [varchar](255) NULL,
    [Record3] [varchar](255) NULL,
    [Record4] [varchar](255) NULL,
    [Record5] [varchar](255) NULL,
    [Record6] [varchar](255) NULL,
    [Record7] [varchar](255) NULL,
    [Record8] [varchar](255) NULL,
    [Record9] [varchar](255) NULL,
    [Record10] [varchar](255) NULL,
    [Record11] [varchar](255) NULL
) ON [PRIMARY]
GO

现在要从表 1 到表 2 中获取数据。我将使用公用表表达式 (CTE) 和 LEAD 函数。

WITH preselect AS
( 
    SELECT  Column1
           ,Column2 AS 'FileID'
           ,LEAD(Column2,1,0) OVER(ORDER BY TableId) AS 'Record1'
           ,LEAD(Column2,2,0) OVER(ORDER BY TableId) AS 'Record2'
           ,LEAD(Column2,3,0) OVER(ORDER BY TableId) AS 'Record3'
           ,LEAD(Column2,4,0) OVER(ORDER BY TableId) AS 'Record4'
           ,LEAD(Column2,5,0) OVER(ORDER BY TableId) AS 'Record5'
           ,LEAD(Column2,6,0) OVER(ORDER BY TableId) AS 'Record6'
           ,LEAD(Column2,7,0) OVER(ORDER BY TableId) AS 'Record7'
           ,LEAD(Column2,8,0) OVER(ORDER BY TableId) AS 'Record8'
           ,LEAD(Column2,9,0) OVER(ORDER BY TableId) AS 'Record9'
           ,LEAD(Column2,10,0) OVER(ORDER BY TableId) AS 'Record10'
           ,LEAD(Column2,11,0) OVER(ORDER BY TableId) AS 'Record11'
    FROM Table_1
)

INSERT INTO Table_2
SELECT FileID,Record1,Record2,Record3,Record4,Record5,Record6,Record7
       ,Record8,Record9,Record10,Record11
FROM preselect
WHERE Column1 = 'FILE ID:'

我在 LEAD 函数中按 TableId 排序,以确保数据的顺序。然后只需获取 FileId 值以及接下来 11 行的值即可。

LEAD(事务处理-SQL

公用表表达式 (CTE)


推荐阅读