2017-03-01 108 views
0

我在uni项目上并坚持使用它。我在下面有一些数据,我想改变它,看起来像在第二张表中。这是可能在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左右,并且会增加... –