简体   繁体   中英

SQL Server: rows to columns

sample datas

 date     | num | name | value
 01012012 |  1  |    A |  20
 01012012 |  1  |    B |  30
 01012012 |  2  |    C |  40

wish to like this

 date     | num |  A |  B |  C
 01012012 |   1 | 20 | 30 | --
 01012012 |   2 | -- | -- | 40
  • name is not fixed can allow many names

How about something like

DECLARE @Table TABLE(
        date DATETIME,
        num INT,
        name VARCHAR(20),
        value FLOAT
)
INSERT INTO @Table SELECT '20121201',1,'A',20
INSERT INTO @Table SELECT '20121201',1,'B',30
INSERT INTO @Table SELECT '20121201',2,'C',40

SELECT  *
FROM    (
            SELECT  date,
                    num,
                    name,
                    value
            FROM    @Table
        ) t
PIVOT   (
            SUM(Value) FOR name IN ([A],[B],[C])
        ) p

SQL Fiddle DEMO

For dynamic columns you need to use dynamic SQL

SQL FIDDLE EXAMPLE

declare
    @cols nvarchar(max),
    @stmt nvarchar(max)

select @cols = isnull(@cols + ', ', '') + '[' + Name + ']' from table1

select @stmt = '
    select *
    from table1 as T
        pivot 
        (
            max(T.value)
            for name in (' + @cols + ')
        ) as P'

exec sp_executesql  @stmt = @stmt

If you don't need a dynamic number of columns, you can use plain SQL like

select *
from table1 as T
    pivot 
    (
        max(T.value)
        for name in ([A],[B],[C])
    ) as P

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM