2017-03-01 7 views
0

私はuniプロジェクトにおり、これに固執しています。私は以下のデータを持っており、2番目の表のように変更して見たいと思っています。 SQLでこれを実行することは可能ですか?動的なものにすることはできますか?誰からの提案ですか?SQLで行から列にデータを再編成

サンプルデータ:

+--------+-------+----------+--------+---------------------------+ 
| dbk | item | dpi | dvb |   name   | 
+--------+-------+----------+--------+---------------------------+ 
| 816408 | Air | 9882067 | 383311 | Virgin Australia   | 
| 816432 | Other | 7205311 | 376023 | House of Travel Ltd  | 
| 816432 | Other | 7205312 | 376023 | House of Travel Ltd  | 
| 816553 | Hotel | 10205063 | 387077 | Mantra On Salt Beach  | 
| 816553 | Ins | 10205064 | 377326 | Allianz Global Assistance | 
| 816553 | Ins | 10205065 | 377326 | Allianz Global Assistance | 
| 816553 | Air | 10205066 | 375704 | Air New Zealand   | 
| 816553 | Air | 10205067 | 375704 | Air New Zealand   | 
| 816553 | Air | 10205068 | 375704 | Air New Zealand   | 
| 816553 | Fee | 10205069 |  0 | Unknown     | 
| 816553 | Air | 10205070 | 375704 | Air New Zealand   | 
| 816553 | Air | 10205071 | 375704 | Air New Zealand   | 
| 816553 | Air | 10205072 | 375704 | Air New Zealand   | 
| 816553 | Ins | 10205073 | 377326 | Allianz Global Assistance | 
| 816553 | Air | 10205074 | 375704 | Air New Zealand   | 
| 816553 | Air | 10205075 | 375704 | Air New Zealand   | 
| 816553 | Air | 10205076 | 375704 | Air New Zealand   | 
| 816553 | Ins | 10205077 | 377326 | Allianz Global Assistance | 
| 816553 | Ins | 10205078 | 377326 | Allianz Global Assistance | 
| 816610 | Air | 9986532 | 375704 | Air New Zealand   | 
| 816610 | Other | 9986533 | 375964 | HOT Dunedin Ltd   | 
| 816610 | Air | 9986534 | 375704 | Air New Zealand   | 
| 816649 | Other | 10211542 | 383181 | Conxion     | 
| 816649 | Other | 10211543 | 383181 | Conxion     | 
| 816649 | Other | 10211544 | 383181 | Conxion     | 
| 816649 | Other | 10211545 | 383181 | Conxion     | 
| 816649 | Fee | 10211546 |  0 | Unknown     | 
| 816649 | Air | 10211547 | 375704 | Air New Zealand   | 
| 816649 | Air | 10211548 | 375704 | Air New Zealand   | 
| 816649 | Hotel | 10211549 | 384400 | Mantra Sun City   | 
| 816743 | Air | 7204575 | 382920 | Qantas Airways   | 
| 816743 | Air | 7204576 | 382920 | Qantas Airways   | 
| 816779 | Fee | 7204884 |  0 | Unknown     | 
| 816866 | Air | 9892676 | 375704 | Air New Zealand   | 
+--------+-------+----------+--------+---------------------------+ 

期待される結果:

+--------+------------------+---------+----------------------+---------------------------+---------------------+ 
| dbk |  Air  | Fee |  Hotel   |   Ins   |  Other  | 
+--------+------------------+---------+----------------------+---------------------------+---------------------+ 
| 816408 | Virgin Australia |   |      |       |      | 
| 816432 |     |   |      |       | House of Travel Ltd | 
| 816553 | Air New Zealand | Unknown | Mantra On Salt Beach | Allianz Global Assistance |      | 
| 816610 | Air New Zealand |   |      |       | HOT Dunedin Ltd  | 
| 816649 | Air New Zealand | Unknown | Mantra Sun City  |       | Conxion    | 
| 816743 | Qantas Airways |   |      |       |      | 
| 816779 |     | Unknown |      |       |      | 
| 816866 | Air New Zealand |   |      |       |      | 
+--------+------------------+---------+----------------------+---------------------------+---------------------+ 
+3

は、情報のためにオフサイトのリソースへのリンクを投稿しないでくださいあなたの質問についてすべての関連情報をあなたの質問に直接投稿してください。 – Siyual

+0

あなたはどのDBMSを使用していますか? Postgres?オラクル? DB2?ファイアバード? –

答えて

0

これは(SQL Serverを仮定して)行います:

if OBJECT_ID('tempdb..#tmp') is not null 
    drop table #tmp; 

create table #tmp 
(
    tmp_sid int not null identity(1,1), 
    dbk varchar(80), 
    item varchar(80), 
    dpi varchar(80), 
    dvb varchar(80), 
    name varchar(80) 
); 

insert into #tmp values('816408','Air','9882067','383311','Virgin Australia'); 
insert into #tmp values('816432','Other','7205311','376023','House of Travel Ltd'); 
insert into #tmp values('816432','Other','7205312','376023','House of Travel Ltd'); 
insert into #tmp values('816432','Other','7205312','376023','House of Travel Ltd'); 
insert into #tmp values('816553','Hotel','10205063','387077','Mantra On Salt Beach'); 
insert into #tmp values('816553','Ins','10205064','377326','Allianz Global Assistance'); 
insert into #tmp values('816553','Ins','10205065','377326','Allianz Global Assistance'); 
insert into #tmp values('816553','Fee','10205069','0','Unknown'); 

declare @q varchar(max); 

select 
    @q = coalesce(@q + ',', '') + QUOTENAME(item) 
from 
    #tmp 
group by 
    item; 

set @q = 'select dbk,' + @q + 'from #tmp pivot (max(item) for item in (' + @q + ')) U' 

exec (@q); 
+0

ありがとうございます。しかし、動的なもののための任意の提案? –

+0

なぜ動的なのですか?どのデータに踏み込むことができますか? – Alex

+0

私はちょうど固定された数の項目名を与えました。私は複数の項目を持っており、約50であり、増加するでしょう... –

関連する問題