0

次のテーブルがあります...それをTable1と呼びましょう

 TERM           PERIOD  Average     StandardDeviation   Minimum
+ 1 Period      2012Q3  0.00417     0.00722             0
+ 120 Periods   2012Q3  0.02951     0.0014              0.028615
+ 20 Periods    2012Q3  0.009898    0.0037              0.007612
+ 40 Periods    2012Q3  0.018255    0.00262             0.016565
+ 1 Period      2012Q4  0.005       0.007               0
+ 120 Periods   2012Q4  0.026       0.001               0.03
+ 20 Periods    2012Q4  0.007       0.003               0.0042
+ 40 Periods    2012Q4  0.018       0.002               0.0165

次のようなテーブルを作成できるように、これをコーディングする方法はありますか。

TERM           PATHS              2012Q3    2012Q4
+ 1 Period     Average            0.00417   0.005
+ 1 Period     StandardDeviation  0.00722   0.007
+ 1 Period     Minimum            0         0

...など、各 TERM (+ 120 ピリオド、+ 40 ピリオドなど) について。

4

2 に答える 2

3

この結果を生成するには、UNPIVOTPIVOT関数の両方を使用する必要があります。はUNPIVOT列を取り、AverageそれらStandardDeviationMinimum複数の行に変換します。行を取得したらPIVOTPeriod値に適用できます。コードは次のようになります。

select term, paths,[2012Q3], [2012Q4]
from
(
  select term, period, paths, value
  from
  (
    select term, period, Average, StandardDeviation, Minimum
    from table1
  ) s
  unpivot
  (
    value
    for paths in (Average, StandardDeviation, Minimum)
  ) unpiv
) src
pivot
(
  max(value)
  for period in ([2012Q3], [2012Q4])
) piv

SQL Fiddle with Demoを参照してください。

これは、を使用しUNION ALLてデータのピボットを解除し、集計関数CASEをピボットする式とともに使用して行うこともできます。

select term,
  paths,
  max(case when period = '2012Q3' then value end) [2012Q3],
  max(case when period = '2012Q4' then value end) [2012Q4]
from
(
  select term, period, 'Average' Paths, average value
  from Table1
  union all
  select term, period, 'StandardDeviation' Paths, StandardDeviation
  from Table1
  union all
  select term, period, 'Minimum' Paths, Minimum
  from Table1
) src
group by term,  paths

SQL Fiddle with Demoを参照してください。

上記のバージョンは、既知の数の値がある場合にうまく機能しperiodます。そうでない場合は、動的 sql を使用して結果を生成する必要があります。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(PERIOD) 
                    from Table1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query 
    = 'select term, paths, '+@cols+'
       from
       (
         select term, period, paths, value
         from
         (
           select term, period, Average, StandardDeviation, Minimum
           from table1
         ) s
         unpivot
         (
           value
           for paths in (Average, StandardDeviation, Minimum)
         ) unpiv
       ) p
       pivot
       (
          max(value)
          for period in('+@cols+')
       ) piv'

execute(@query)

SQL Fiddle with Demoを参照してください。

すべてのバージョンで同じ結果が得られます。

于 2013-02-01T20:33:47.473 に答える
0

これを集計と結合としてアプローチします。. .

select term, paths,
       MIN(case when period = '2012Q3'
                then (case when which = 'Average' then t.average
                           when which = 'StandardDeviation' then t.StandardDeviation
                           when which = 'Minimum' then t.Minimum
                      end)
            end) as "2012Q3",
       MIN(case when period = '2012Q4' 
                then (case when which = 'Average' then t.average
                           when which = 'StandardDeviation' then t.StandardDeviation
                           when which = 'Minimum' then t.Minimum
                      end)
            end) as "2012Q4"
from Table1 t cross join
     (select 'Average' as paths union all
      select 'StandardDeviation' union all
      select 'Minimum'
     ) const
group by term, paths
于 2013-02-01T20:37:38.667 に答える