【问题标题】:Pivot Table Code, Need some ideas数据透视表代码,需要一些想法
【发布时间】:2013-07-29 13:19:28
【问题描述】:

我正在处理一个枢轴问题。我想出了一些代码,但未能成功编写代码。请有人给我一些关于我在这里做错了什么的指导吗?

我有表 1,它是在下面的代码中创建的:

create table T1 (
     [name]  varchar(30)
    ,[size]  int
    ,[DT]  date)

 insert into T1 values ( 'x1', 14,  '01/03/2013' );
 insert into T1 values ( 'x1', 134, '01/04/2013' );
 insert into T1 values ( 'x1', 199, '01/05/2013' );
 insert into T1 values ( 'x1', 284, '01/06/2013' );
 insert into T1 values ( 'x2', 212, '01/03/2013' );
 insert into T1 values ( 'x2', 369, '01/04/2013' );
 insert into T1 values ( 'x2', 439, '01/05/2013' );
 insert into T1 values ( 'x2', 555, '01/06/2013' );

我需要将表格转成这种格式:

    01/03/13  01/04/2013    01/05/2013   01/16/2013
X1    14            134        199         284
X2    212           369        439         555

这是我一直在处理的代码,但未能成功地将其用于上述输出?对我有什么想法或指示吗?提前谢谢...

declare @DateList as varchar(max)
declare @dynamic_PQ as varchar(max)

select @DateList = 
  stuff(      (
select DISTINCT  
      ', '+ Quotename(CONVERT(VARCHAR(10),DT,110))
    from
    (       select dt  from t1 ) t
   for xml path ('')
   ),1,1,'')

  select @DateList 

 set @dynamic_PQ = 'select [GuestID], ' + @DateList + 
  ' from
    (
    Select [name],
      size,
      STUFF((SELECT distinct '', '' + convert(a2.size as varch(10))
               from t1 a2
               where src.name = a2.name
                  and src.dt = a2.dt
                  FOR XML PATH(''''), TYPE
                  ).value(''.'', ''NVARCHAR(MAX)'') 
              ,1,1,'''') answer
    from
    (
      select name,
        dt ,
        size
      from t1
    ) src
   ) as S
   PIVOT

   (
    MAX([size])
    for Question IN (' + @DateList + ')
   ) as P

   Exec(@dynamic_PQ)

PS:如果您需要做一些特别的事情来让任何人回答/回复您的帖子,请随时在您的回复中分享。

【问题讨论】:

    标签: sql sql-server sql-server-2008-r2 pivot


    【解决方案1】:

    您有未闭合的引号,多余的括号,不需要在动态 sql 中使用 STUFF FOR XML 的整个部分(用于描述的输出),列名错误...

    declare @DateList as varchar(max)
    declare @dynamic_PQ as varchar(max)
    
    select @DateList = 
      stuff(      (
    select DISTINCT  
          ', '+ Quotename(CONVERT(VARCHAR(10),DT,110))
        from
        (       select dt  from t1 ) t
       for xml path ('')
       ),1,1,'')
    
      --select @DateList 
    
     set @dynamic_PQ ='SELECT * from
        (
          select name,
            dt ,
            size
          from t1
        ) as S
       PIVOT
       (
        MAX([size])
        for DT IN ('+ @DateList +')
       ) as P'
    
    
    
       EXEC (@dynamic_PQ)
    

    SQLFiddle DEMO

    【讨论】:

      【解决方案2】:

      您的查询有多个错误。此版本有效:

      select [name], [01-03-2013], [01-04-2013], [01-05-2013], [01-06-2013]
      from ( Select [name], size,
             STUFF((SELECT distinct ', ' + cast(a2.size as varchar(10))
                    from t1 a2
                    where src.name = a2.name and src.dt = a2.dt
                    FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,''
                    ) as question
             from ( select name, dt , size
                    from t1
                  ) src
           ) S
      PIVOT ( MAX([size]) for Question IN ([01-03-2013], [01-04-2013], [01-05-2013], [01-06-2013])
            )as pvt;
      

      您应该通过打印出 SQL 并运行它来调试它。以下是一些问题:

      • 您在数据透视表中使用了question,但在代码中定义了answer
      • 表达式convert(a2.size as varch(10)) 是无意义的SQL
      • pivot 语句需要别名
      • GuestId 列未定义

      【讨论】:

        【解决方案3】:

        这是一个简单的查询

        select name, [01-03-2013], [01-04-2013], [01-05-2013], [01-06-2013] from
                (select  name, size, DT from T1)a
                PIVOT(sum(size) for DT in ([01-03-2013], [01-04-2013], [01-05-2013], [01-06-2013])) as pvt
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-19
          • 1970-01-01
          相关资源
          最近更新 更多