1

次のようなデータセットがあります。

FirstName   LastName   Field1   Field2   Field3 ... Field27
---------   --------   ------   ------   ------     -------
 Mark        Smith     A        B        C          D
 John        Baptist   X        T        Y          G
 Tom         Dumm      R        B        B          U

ただし、データは次のようになります。

FirstName   LastName   Field   Value
---------   --------   -----   -----
Mark        Smith      1       A
Mark        Smith      2       B
Mark        Smith      3       C
Mark        Smith      4       D
John        Baptist    1       X
John        Baptist    2       T
John        Baptist    3       Y
John        Baptist    4       G
Tom         Dumm       1       R
Tom         Dumm       2       B
Tom         Dumm       3       B
Tom         Dumm       4       U

PIVOT機能を見てきました。それはうまくいくかもしれません。よくわかりません。使い方がわからなかった。しかし、ピボットが「フィールド」列に「4」を配置できるかどうかはわかりません。私の理解では、PIVOT関数は、Field1...Field27の値を「Value」列に単純に転置します。

また、カーソルを使用してテーブルを反復処理し、フィールドの列をループしてから、別のテーブルに「フィールド」と「値」を挿入することも検討しました。ただし、これはシリアルベースの操作であるため、パフォーマンスに影響を与えることはわかっています。

どんな助けでも大歓迎です!お分かりのように、私はT-SQL(または一般的なSQL)とSQLServerにまったく慣れていません。

4

3 に答える 3

4

UNPIVOTで実行できます。これを行うには、次の 2 つの方法があります。

1) 静的アンピボットでは、クエリでフィールド列をハードコーディングします。

select firstname
  , lastname
  , replace(field, 'field', '')  as field
  , value
from test
unpivot
( 
  value
  for field in (field1, field2, field3, field27)
) u

実際のデモについては、 SQL Fiddleを参照してください。

2) または、SQL の実行時にアイテムのリストを PIVOT に取得する Dynamic Unpivot を使用することもできます。ピボットを解除するフィールドが大量にある場合、ダイナミックは最適です。

create table mytest
(
  firstname varchar(5),
  lastname varchar(10),
  field1 varchar(1),
  field2 varchar(1),
  field3 varchar(1),
  field27 varchar(1)
)

insert into mytest values('Mark', 'Smith', 'A', 'B', 'C', 'D')
insert into mytest values('John', 'Baptist', 'X', 'T', 'Y', 'G')
insert into mytest values('Tom', 'Dumm', 'R', 'B', 'B', 'U')

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

select @cols = stuff((select ','+quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('mytest') and
               C.name like 'Field%'
         for xml path('')), 1, 1, '')

set @query = 'SELECT firstname, lastname, replace(field, ''field'', '''')  as field, value
            from mytest
            unpivot 
            (
               value
               for field in (' + @cols + ')
            ) p '

execute(@query)

drop table mytest

どちらも同じ結果になります。

于 2012-05-29T18:48:19.990 に答える
3

迅速で汚い方法よりもクエリを実行したい場合は、Unionを作成することです

             Select FirstName,LastName,1,Field1
             from table
             UNION ALL
             Select FirstName,LastName,2,Field2
             from table
             . 
             .

そして、すべてのフィールド列で同様です

于 2012-05-29T18:22:42.470 に答える
1

ピボットを使用する代わりに、unpivot次のように使用します。

select firstname, lastname, substring(field,6,2) as field, value
from <yourtablename>
unpivot(value for field in (field1,field2,field3,field4,field5,field6,field7,field8,field9,field10,field11,field12,field13,field14,field15,field16,field17,field18,field19,field20,field21,field22,field23,field24,field25,field26,field27,field1,field2,field3,field4,field5,field6,field7,field8,field9,field10,field11,field12,field13,field14,field15,field16,field17,field18,field19,field20,field21,field22,field23,field24,field25,field26,field27)) as unpvt;
于 2012-05-29T18:30:45.967 に答える