透视多列

时间:2013-05-24 09:05:19

标签: oracle plsql oracle11g plsqldeveloper

我陷入了一个复杂的问题。我知道它可以通过旋转来解决,但不知道该怎么做。

数据如下:

------------------------------------------------------------------
| user_id | order_id | service |  head | coordinatior | contract |
------------------------------------------------------------------
| 1020    | 3        | 105     |   1   |    1         |     1    |
| 364277  | 1        | 105     |   0   |    0         |     0    |
| 364277  | 3        | 105     |   0   |    0         |     0    | 
| 367277  | 2        | 3763454 |   1   |    1         |     0    |
| 1020    | 1        | 3764142 |   0   |    1         |     1    |
| 1020    | 2        | 665443  |   0   |    1         |     1    |
------------------------------------------------------------------  

根据订单,这就是我想要的方式:


| user_id | service1 |  head1 | coordinatior1 | contract1 | service2  |   head2 | coordinatior2 | contract2 |  service3 |  head3 | coordinatior3 | contract3 |
--------------------------------------------------------------------------------------------------------------------------------------------------------------
| 1020    | 3764142  |   0    |      1        |    1      |   665443  |   0     |      1        |    1      |   105     |   1    |      1        |    1      |
| 364227  | 105      |   0    |      0        |    0      |   3763454 |   1     |      1        |    0      |   105     |   0    |      0        |    0      |
--------------------------------------------------------------------------------------------------------------------------------------------------------------

现在我显示了3个服务,因为它将成为一个巨大的水平滚动条,但每个user_id最多可以有10个服务,这意味着某些用户可能有4个服务。

这就是我查询的内容。

SELECT user_id, service FROM table 
PIVOT (?) FOR order_id IN (0, 1, 2, 3 ,4 ,5 ,6, 7, 8, 9, 10))

我不知道如何继续前进。有帮助吗? 在此先感谢: - )

1 个答案:

答案 0 :(得分:1)

试试这段代码:

select user_id ,max(case when order_id=1 then service end) as service_1 ,max(case when order_id=2 then service end) as service_2 from table
group by user_id

service_1,2..10是一样的。