1

いくつかのデータを表示する最良の方法を見つけようとしています。

私のデータセットは次のようになります。

Form  var1_Day  var1_WTD  var1_30Day  var2_Day  var2_WTD  var2_30Day ...
NA    null      null      null        77        448       2581
A1    166       791       4842        null      null      null
A2    304       1312      8365        null      null      null
A3    29        113       656         null      null      null

次のようにデータを表示する方法を理解しようとしています。

Var   Form  Day   WTD   30Day
var1  NA    null  null  null
var1  A1    166   791   4842
var1  A2    304   1312  8365
var1  A3    29    113   656
var2  NA    77    448   2581
var2  A1    null  null  null
var2  A2    null  null  null
var2  A3    null  null  null
...

ピボット テーブルを使用する必要があると思いますが、どこから始めればよいかわかりません。

ありがとう、ブラッド

4

2 に答える 2

2

他の回答のように静的ピボットを介してこれを行うことができますが、変換する列が多数ある場合は、動的ピボットを使用できます。

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

SET @colsUnPivot = stuff((select ','+quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('test') and
               C.name like 'var%'
         for xml path('')), 1, 1, '')

SET @colsUnPivotNull = stuff((select ', IsNull('+ quotename(C.name) +', 0)' + quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('test') and
               C.name like 'var%'
         for xml path('')), 1, 1, '')

SET @colsPivot = stuff((select DISTINCT ','+quotename(right((C.name), len(C.name)-5))
         from sys.columns as C
         where C.object_id = object_id('test') and
               C.name like 'var%'
         for xml path('')), 1, 1, '')

set @query 
  = ' 
      SELECT var, form,  '+ @colsPivot +'
      FROM
      (
        SELECT distinct substring(field, 1, 4) var, 
          --field,
          right((field), len(field)-5) as col,
          form,
          value
        from 
        (
          SELECT form, '+ @colsUnPivotNull + '
          FROM test
        ) t1
        unpivot 
        (
           value
           for field in (' + @colsUnPivot + ')
        ) unpvt 
      ) x
      pivot
      (
        sum(value)
        for col in ('+ @colsPivot + ')
      ) p
      ORDER BY var, form'

execute(@query)

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

これにより、ピボットを解除する列のリストと、実行時のピボットが取得されます。多数の列がある場合は、値をハードコーディングする必要はありません。

于 2012-08-10T15:38:39.320 に答える
1

実際、あなたが欲しいUNPIVOT

そのようです...

select SUBSTRING(t,1,4) as Var, form, day, wtd, 30day 
from yourtable
unpivot ([day] for d in (var1_day,var2_day)) td
unpivot ([wtd] for w in (var1_wtd,var2_wtd)) tw
unpivot ([30day] for t in (var1_30day,var2_30day)) tt
where SUBSTRING(d,1,4) = SUBSTRING(w,1,4)
and  SUBSTRING(d,1,4) = SUBSTRING(t,1,4)
于 2012-08-10T14:41:46.133 に答える