Transposing Rows in to colums in SQL Server 2005

前端 未结 2 2025
天涯浪人
天涯浪人 2020-12-22 06:28

I have an sql query \"Select * from tablename\" whose output is

col1   col2       
  A     1 
  B     2 
  C     3

I want to modify the ab

2条回答
  •  北荒
    北荒 (楼主)
    2020-12-22 06:59

    You will need to perform a PIVOT. There are two ways to do this with PIVOT, either a Static Pivot where you code the columns to transform or a Dynamic Pivot which determines the columns at execution.

    Static Pivot:

    SELECT *
    FROM
    (
        SELECT col1, col2
        FROM yourTable
    ) x
    PIVOT
    (
       min(col2)
       for col1 in ([A], [B], [C])
    )p
    

    See SQL Fiddle with Demo

    Dynamic Pivot:

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @cols = STUFF((SELECT distinct ',' + QUOTENAME(col1) 
                        from t1
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = 'SELECT ' + @cols + ' from 
                 (
                    select col1, col2
                    from t1
                ) x
                pivot 
                (
                    min(col2)
                    for col1 in (' + @cols + ')
                ) p '
    
    execute(@query)
    

    See SQL Fiddle with Demo

    If you do not want to use the PIVOT function, then you can perform a similar type of query with CASE statements:

    select 
      SUM(CASE WHEN col1 = 'A' THEN col2 END) as A,
      SUM(CASE WHEN col1 = 'B' THEN col2 END) as B,
      SUM(CASE WHEN col1 = 'C' THEN col2 END) as C
    FROM t1
    

    See SQL Fiddle with Demo

提交回复
热议问题