代码之家  ›  专栏  ›  技术社区  ›  marty

如何使用SQLServer2005从一个表透视数据

  •  1
  • marty  · 技术社区  · 17 年前

    我想从具有以下列的单个表创建查询。

    SEQNO是一个唯一的键

    Name   ID   Amount   Date          JOBID       SEQNO
    Mark    9    200     1/2/09         1001         1
    Peter   3    300     1/2/09         1001         2
    Steve   1    200     2/2/09         1001         3
    Mark    9    200     3/2/09         1001         4
    Peter   3    300     4/2/09         1001         5
    Steve   1    200     5/2/09         1001         6
    Hally   1    200     5/2/09         1002         7
    

    查询应按subobid和日期以这种格式输出范围:-

    **NAME      ID      1/2       2/2     3/2     4/2     5/2      JOBID**<br>
    Mark        9       200       NULL    200     NULL    NULL     1001   
    Peter       3       300       NULL    NULL    300     NULL     1001   
    Steve       1       NULL      200     NULL    NULL    200      1001   
    

    我一直在检查这个的透视查询。但我好像哪儿也去不了。有人能帮忙吗?

    1 回复  |  直到 9 年前
        1
  •  2
  •   Taryn Frank Pearson    14 年前

    这实际上可以很容易地用 PIVOT 功能。由于另一个答案没有显示与如何执行它相关的代码,下面有两种方法 支点 数据。

    首先是一个 静态枢轴 . 静态轴心点是指提前知道要转换为列的数据。

    select *
    from 
    (
        select name, id, convert(char(5), dt, 101) dt, jobid, amount
        from test
    ) x
    pivot
    (
        sum(amount)
        for dt in ([01/02], [02/02], [03/02], [04/05], [05/05])
    )p
    order by jobid, name
    

    看到了吗 SQL Fiddle with Demo

    第二种方法是使用 动态枢轴

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(char(5), dt, 101)) 
                        from test
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = 'SELECT name, id, ' + @cols + ', jobid from 
                 (
                    select  name, id, convert(char(5), dt, 101) dt, jobid, amount
                    from test
                ) x
                pivot 
                (
                    sum(amount)
                    for dt in (' + @cols + ')
                ) p 
                order by jobid, name'
    
    execute(@query)
    

    看到了吗 SQL Fiddle with Demo

    推荐文章