SQL Server 2005,将列转换为行

fra*_*sek 7 sql pivot

我试图将一个表转90度:使列行.由于PIVOT需要聚合函数,因此不允许PIVOT.

示例:我有一个包含列的表:
ID int,
ISO char(2),
Text varchar(255).

所以我有这个:

ID ISO Text
-- --- ----
 1 DE  Auto
 2 EN  Car

我想得到以下内容:

ID EN  DE
-- --- ----
 1 Car Auto

你是如何实现这一目标的?

cas*_*One 5

这个答案真的是frantisek的,我只是在这里复制以纠正错误(我无法直接编辑).

基本上,您使用该解决方案,并进行调整:

SELECT 
    max(DE) as DE, max(EN) as EN 
FROM 
    test 
PIVOT (MAX([text]) FOR ISO in (DE,EN)) p
Run Code Online (Sandbox Code Playgroud)

这将使内容成为一行.此外,它会删除ID,因为如果您想要一行(在组合成单行时没有逻辑来指示如何处理它),这是没有意义的.

此外,假设ISO列中的值是唯一的,否则,由于MAX聚合,这将丢失数据.


spl*_*tne 0

由于您明确要求非枢轴解决方案:如果您知道行中将有哪些 ISO,那么这应该可行。我将该表称为“测试”。

declare @temp table ([ID] int, [de] varchar(255), [en] varchar(255)) -- add ISOs if necessary

INSERT @temp 
SELECT distinct [ID], '', '' from Test -- ADD '' for other ISOs if necessary

DECLARE c CURSOR read_only 
FOR SELECT [ID], [ISO], [Text] from test

DECLARE  @ID int, @ISO char(2), @Text varchar(255)
OPEN c

FETCH NEXT FROM c INTO @ID, @ISO, @Text
WHILE (@@fetch_status <> -1)
BEGIN
    IF (@@fetch_status <> -2)
    BEGIN
        UPDATE  @temp
        SET     [DE] = case when @ISO = 'DE' then @Text else [de] end,
            [EN] = case when @ISO = 'EN' then @Text else [en] end
                    -- add ISOs if necessary
        WHERE   [ID] = @ID
    END
    FETCH NEXT FROM c INTO @ID, @ISO, @Text
END

CLOSE c
DEALLOCATE c

SELECT * FROM @temp
Run Code Online (Sandbox Code Playgroud)