现有一数据库表
订购单payment (KEY: ORDER)
订购员(ORDER)、定金_现金(D_CASH)、定金_汇款(D_TRANSFER)、定金_有价证券(D_DRAFT)、定金_抵押(D_OFFSET)、未付_现金(W_CASH)、未付_汇款(W_TRANSFER)、未付_有价证券(W_DRAFT)、未付_抵押(W_OFFSET)
数据例:
1001   100     0     0     0     0     0     0     0
1002     0     0     0     0   100     0     0     0
1003     0   100     0     0     0     0   100     0
1004     1     2     3     4     5     6     7     8
要求:
① 抽出数据为如下形式
② 订购员(ORDER)、类型(BTYPE)、现金(CASH)、汇款(TRANSFER)、有价证券(DRAFT)、抵押(OFFSET)  
 其中:定金的类型为1 未付的类型为2
③ 定金、未付的相应数据全部为0时 不抽出
按上面要求 则上面数据例的最终结果应该为
1001  1   100     0     0     0
1002  2   100     0     0     0
1003  1     0   100     0     0
1003  2     0     0   100     0
1004  1     1     2     3     4
1004  2     5     6     7     8
这个SQL应该怎样写?(好像就是行列转换)

解决方案 »

  1.   

    select ORDER, 1 status, D_CASH, D_TRANSFER, D_DRAFT, D_OFFSET from payment where nvl(D_CASH,0)>0 and   nvl(D_TRANSFER,0)>0 and nvl(D_DRAFT,0) >0 and nvl(D_OFFSET, 0) union all
    select ORDER, 2 status, W_CASH, W_TRANSFER, W_DRAFT, W_OFFSET from payment where nvl(W_CASH,0)>0 and   nvl(W_TRANSFER,0)>0 and nvl(W_DRAFT,0) >0 and nvl(W_OFFSET, 0)
      

  2.   

    select ORDER, 1 status, D_CASH, D_TRANSFER, D_DRAFT, D_OFFSET from payment where nvl(D_CASH,0)>0 and  nvl(D_TRANSFER,0)>0 and nvl(D_DRAFT,0) >0 and nvl(D_OFFSET, 0) >0 union all
    select ORDER, 2 status, W_CASH, W_TRANSFER, W_DRAFT, W_OFFSET from payment where nvl(W_CASH,0)>0 and  nvl(W_TRANSFER,0)>0 and nvl(W_DRAFT,0) >0 and nvl(W_OFFSET, 0)>0
      

  3.   

    select order1,1,d_cash cash,d_transfer transfer,d_draft draft, d_offset offset
      from payment where not(d_cash=0 and d_transfer=0 and d_draft=0 and d_offset=0)
    union all
    select order1,2,w_cash,w_transfer ,w_draft,w_offset
      from payment where not(w_cash=0 and w_transfer=0 and w_draft=0 and w_offset=0) 
    order by 1,2