原表test_table:
NAME | TYPE | a | 1 | b | 1 | c | 1 | d | 1 | e | 2 | f | 2 | g | 2 | h | 2 | i | 3 | j | 3 | k | 3 | l | 3 | m | 4 | n | 4 | o | 4 | p | 4 |
要求:
NAME1
| NAME2
| NAME3
| NAME4
| a
| e
| i
| m
| b
| f
| j
| n
| c
| g
| k
| o
| d
| h
| l
| p
| 执行如下SQL即可,
select
max(decode(type,1,name,null) ) name1,
max(decode(type,2,name,null) ) name2,
max(decode(type,3,name,null) ) name3,
max(decode(type,4,name,null) ) name4
from(
select name,
row_number() over(partition by type order by type) rid,
type
from test_table
)t
group by rid
如果需要:
NAME1
| NAME2
| NAME3
| NAME4
| a
| b
| c
| d
| e
| f
| g
| h
| i
| j
| k
| l
| m
| n
| o
| p
| 只要将type和rid替换位置即可。
select
max(decode(rid,1,name,null) ) name1,
max(decode(rid,2,name,null) ) name2,
max(decode(rid,3,name,null) ) name3,
max(decode(rid,4,name,null) ) name4
from(
select name,
row_number() over(partition by type order by type) rid,
type
from test_table
)t
group by type
rid是每个分组的组序号。
如果不添加goup by,则只能取到一行最大数据。
这样的SQL要求列数必须固定,因为SQL是写死的。这样的话,直接匹配需求的可能性比较小。
动态生成SQL就可以了。 |
|