1

次のサンプルデータを含む次の表があります

ID  Language       Question       SubQuestion     SubSubQuestion    TotalCount  TotalPercent
3      E               9               0                1             88527            73%
3      E               9               0                2             19684            16%
3      E               9               0                3             12960            11%
3      E               9               0                9              933              1%

このように一列に並べたい

    ID  Language        TotalCount901   TotalPercent901     TotalCount902   TotalPercent902 TotalCount903   TotalPercent903
     3       E            88527           73%                 19684             16%              12960              11%

ピボットコマンドを使用するのに疲れましたが、うまくいきません。

4

1 に答える 1

2

列名に基づいていくつかの仮定を立てましたが、これに似たものを使用したいようです。これは、要求した列の値を取得するために、UNPIVOTと 次に の両方を適用します。PIVOT

select *
from
(
  select id,
    language,
    col + cast(QUESTION as varchar(10))
      +cast(subquestion as varchar(10))
      +cast(SubSubQuestion as varchar(10)) col,
    value
  from
  (
    select id, language,
      cast(TotalCount as varchar(10)) TotalCount, 
      totalPercent,
      question, subquestion, SubSubQuestion
    from yourtable
  ) usrc
  unpivot
  (
    value 
    for col in (totalcount, totalpercent)
  ) un
) srcpiv
pivot
(
  max(value)
  for col in ([TotalCount901], [totalPercent901], 
              [TotalCount902], [totalPercent902], 
              [TotalCount903], [totalPercent903],
              [TotalCount909], [totalPercent909])
) p

デモで SQL Fiddle を参照してください

注:UNPIVOT列を実行するときは、同じデータ型である必要があります。そうでない場合は、データ型を同じにするために変換/キャストする必要があります。

変換する値の数が不明な場合は、動的 SQL を使用できます。

DECLARE @query  AS NVARCHAR(MAX),
    @colsPivot as  NVARCHAR(MAX)


select @colsPivot 
  = STUFF((SELECT  ',' 
             + QUOTENAME(c.name +
                        cast(QUESTION as varchar(10))
                        +cast(subquestion as varchar(10))
                        +cast(SubSubQuestion as varchar(10)))
           from yourtable t
           cross apply sys.columns as C
           where C.object_id = object_id('yourtable') and
              C.name in ('TotalCount', 'TotalPercent')
           group by c.name, t.question, t.subquestion, t.subsubquestion
           order by t.SubSubQuestion
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'select *
              from
              (
                select id,
                  language,
                  col + cast(QUESTION as varchar(10))
                    +cast(subquestion as varchar(10))
                    +cast(SubSubQuestion as varchar(10)) col,
                  value
                from
                (
                  select id, language,
                    cast(TotalCount as varchar(10)) TotalCount, 
                    totalPercent,
                    question, subquestion, SubSubQuestion
                  from yourtable
                ) usrc
                unpivot
                (
                  value 
                  for col in (totalcount, totalpercent)
                ) un
              ) srcpiv
            pivot 
            (
                max(value)
                for col in (' + @colsPivot + ')
            ) p '

execute(@query)

デモで SQL Fiddle を参照してください

于 2012-11-01T20:12:14.563 に答える