【问题标题】:Converting Certain Columns into Row Data将某些列转换为行数据
【发布时间】:2014-10-18 22:18:08
【问题描述】:

不幸的是,有一张表格被设计成以下格式(最多 39 个而不是 3 个):

TABLE: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 上为每一行插入一行,然后将 1 替换为 2,等等。但即使使用这种方法,我也不确定如何在Nm_1、Age1 和 State1 用于原始表中的所有行实例。

【问题讨论】:

  • 你可能需要结合使用 UNPIVOT 和 PIVOT

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


【解决方案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)

【讨论】:

  • 我试过这个但反复得到一个“Incorrect syntax near 'c'”错误。在您的示例中,Tbl 代表新表,对吗?
  • 我最终用常规 INSERT 编写了一个 while 循环。老实说..我很自豪能自己解决这个问题,因为我非常愚蠢,但如果你能帮我找出我遗漏的部分,我会很高兴的。如果可能有帮助,我用表格的正确名称更新了我的问题。
【解决方案2】:

我知道这不是最干净或最有效的方法,但它适用于我的简单案例。 我使用一个动态字符串来存储 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

`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多