0

私はピボット問題に取り組んでいます。私はいくつかのコードを思いつきましたが、コーディングに失敗しました。ここで私が間違っていることについて、誰かが私にいくつかのガイダンスを教えてください。

以下のコードで作成された表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)

追伸: あなたの投稿に誰かに回答/返信してもらうために何か特別なことをしなければならない場合は、お気軽に返信で共有してください。

4

3 に答える 3

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 デモ

于 2013-07-29T13:43:15.220 に答える
0

ここに簡単なクエリがあります

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
于 2013-07-30T10:24:23.183 に答える
0

クエリに複数のエラーがあります。このバージョンは動作します:

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が定義されていません
于 2013-07-29T13:36:05.380 に答える