将行转换为列 SQL 2008

3

我只想转置以下表格

地区ID      地区           地区代码         地区主管

1     Eastern    E01         Mark
2     Western    W01         Jim
3     Northern    N01        Paul
4     Southern    S01        David

需要翻译的内容:

to

东部         西部        北部           南部

1          2         3            4
E01        W01       N01          S01
Mark       Jim       Paul         David

我使用的是 SQL 2008。非常感谢您的帮助。
祝好!

尝试使用 PIVOT 将行转换为列。 - Navaneethan
这个表格是否有超过四行?如果第五行是1,Eastern,E02,John,预期结果会是什么? - 8kb
行数可能会有所变化,因此需要使用动态的方法。 - GayanSanjeewa
第五行可能是这样的: 5 东南 SE1 约翰并且应该出现在底部表格中:东南(列) 5 (行1) SE1 (行2) 约翰 (行3) - GayanSanjeewa
3个回答

4

请问您能否给我一个示例?因为我目前检查过的示例都不能输出我需要的结果,即使使用了 PIVOT。 - GayanSanjeewa
访问链接,那里有很好的示例。 - DeveloperX
我不相信除非您预先知道结果表中完整的列集,否则您无法成功使用PIVOT。 结果表中只有N,S,W,E,NE,NW,SW,SE吗? - engil

1

0

好的,大家好,最终我找到了一种方法来做到这一点,但可能不是最有效的方法。我还没有找到使用PIVOT的解决方案。

BEGIN
    DECLARE @ColumnList varchar(200)
    DECLARE @ColumnInList varchar(200)
    DECLARE @TableName varchar(20)
    DECLARE @TableScript varchar(2000)                         

    SET @ColumnList = ''
    SET @ColumnInList = ''
    SELECT @ColumnInList += RTRIM(RegionDescription) + ',', @ColumnList += '[' + RTRIM(RegionDescription) + '] varchar(50) , '
    FROM RegionSup 

    SET @ColumnList = LEFT(@ColumnList, LEN(@ColumnList) - 1)
    SET @ColumnInList = LEFT(@ColumnInList, LEN(@ColumnInList) - 1)

    SELECT @TableName = 'TEMP' + CONVERT(char(12),GETDATE(),14);
    SELECT @TableName = REPLACE(@TableName,':','')
    SET @TableScript = 'CREATE TABLE ' + @TableName + ' (' +
                    @ColumnList + ')'

    EXECUTE (@TableScript)


    --Column Values
    DECLARE @RegionID varchar(30)
    DECLARE @RegionSupervisor varchar(50)
    DECLARE @RegionCode varchar(50)
    --End Column Values

    SET @RegionID = ''
    SET @RegionSupervisor = ''
    SET @RegionCode = ''

    SELECT @RegionID += '''' + CONVERT(varchar(10),RegionID) + ''',',
           @RegionSupervisor += '''' + RegionSupervisor + ''',',
           @RegionCode +=  '''' + RegionCode + ''','
    FROM RegionSup

    SET @RegionID = LEFT(@RegionID,LEN(@RegionID) - 1)
    SET @RegionSupervisor = LEFT(@RegionSupervisor,LEN(@RegionSupervisor) - 1)
    SET @RegionCode = LEFT(@RegionCode,LEN(@RegionCode) - 1)

    DECLARE @InsertStatement nvarchar(max)
    SET @InsertStatement = ''

    SET @InsertStatement = 'INSERT INTO ' + @TableName + '(' +  @ColumnInList + ') VALUES ' +
                            '(' + @RegionID + '),' +
                            '(' + @RegionSupervisor + '),' +
                            '(' + @RegionCode + ')' 

    EXECUTE(@InsertStatement)                       

    EXECUTE('SELECT * FROM ' + @TableName)
    EXECUTE('DROP TABLE ' + @TableName)
END

1
正确完成此操作的方法是使用 PIVOT,就像 @womp 建议的那样。 - Matthew
你能给我展示或指向一个链接,以便在相同的输入下获得相同的输出吗?我一直在浏览很多PIVOT样例,但没有找到类似的东西。 - GayanSanjeewa
1
@Matthew 只有使用动态 SQL 才能实现动态 PIVOT。他需要一个例子。 - ErikE
@womp提供的MSDN链接中有示例。 - Brent D
它们非常基础,我认为我的源表列与它们不同。而且这些示例也没有提供关于动态列的任何信息。 - GayanSanjeewa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接