将某些列转换为行数据

时间:2014-10-18 22:18:09

标签: sql sql-server database tsql relational-database

有一个表格不幸以下列格式设计(最多39个而不是3个):

表:Joined_Table

Key        Nm_1    Nm_2     Nm_3    Age1 Age2  Age3 State1  State2  State3
1          Bob     Sally    John    12   13    14   Fl.     AL.     NY. 
2          Jack    Billy    Jean    15   15    83   AL.     TX.     WA.

在开始SharePoint迁移之前,我需要将这些项目行单独添加到单个项目中。我需要将数据复制到另一个表格,类似于这种格式:

表:dbo.Line_Items

K   FK  Name_T  Age_T  State_T
1   1   Bob     12     Fl.
2   1   Sally   13     AL
3   1   John    14     NY
4   2   Jack    15     AL
5   2   Billy   15     TX
6   2   Jean    83     WA

有人被告知考虑使用“交叉申请”,我打算这样做,但我想知道是否有其他人有经验或建议以干净的方式做到这一点(记住这最多39)。我不需要非常动态的东西,因为我不介意不得不输入每个列类型39次。 例如,我正在考虑创建表,然后在Nm_1,Age1,State1上为每行插入一行,然后用2替换1,等等。但即使使用此方法,我也不确定如何创建新行原始表中所有行实例的Nm_1,Age1和State1。

2 个答案:

答案 0 :(得分:1)

交叉申请是一个非常干净的解决方案

select 
    key = row_number() over(order by fk, k),
    fk,
    name_t,
    age_t,
    state_t
from tbl 
cross apply (
    values
        (1, key, nm_1, age1, state1),
        (2, key, nm_2, age2, state2),
        -- ...
        (39, key, nm_39, age39, state39)
) c (k, fk, name_t, age_t, state_t)

答案 1 :(得分:0)

我知道这不是最干净或最有效的,但它适用于我的简单案例。 我使用动态字符串来存储SQL语句,使用while循环来遍历39行中的每一行:

DECLARE @MyQuery nvarchar(MAX)
DECLARE @MyInt int

SET @MyInt = 1

WHILE @MyInt <= 39

BEGIN

SET @MyQuery = 'INSERT INTO dbo.[Line_Items]

(FK, Name_T, Age_T, State_T)

SELECT [Key], [Nm_1], [Age1], [State1]

FROM dbo.Joined_Table

WHERE LTRIM(RTRIM(Nm_1)) NOT LIKE ''''

ORDER BY ID
'

SET @MyQuery = REPLACE(@MyQuery,1,@MyInt)
SET @MyInt = @MyInt+1

EXEC(@MyQuery)

    END

`