我正在使用oracle 11g并编写了一个存储过程,它将值存储在临时表中,如下所示:
id count hour age range
-------------------------------------
0 5 10 61 10-200
1 6 20 61 10-200
2 7 15 61 10-200
5 9 5 61 201-300
7 10 25 61 201-300
0 5 10 62 10-20
1 6 20 62 10-20
2 7 15 62 10-20
5 9 5 62 21-30
1 8 6 62 21-30
7 10 25 62 21-30
10 15 30 62 31-40
现在使用这个临时表我想返回两个游标。一个用于61,一个用于62(年龄)。 对于游标,不同的范围将是列。例如,年龄62的游标应该作为数据集返回。
user 10-20 21-30 31-40
Count/hour count/hour count/hour
----------------------------------------------
0 5 10 - - - -
1 6 20 8 6 - -
2 7 15 - - - -
5 - - 9 5 - -
7 - - 10 25 - -
10 - - - - 15 30
临时表中的此列范围不是固定值,这些值是从其他表引用的。
编辑:我正在使用PIVOT来解决上述问题,我在互联网上看到的所有例子都是列值的固定值(在我的情况下是范围)。我怎样才能获得动态价值。以下是ex查询:
SELECT *
FROM (SELECT column_2, column_1
FROM test_table)
PIVOT (SUM(column1) AS sum_values FOR (column_2) IN ('value1' AS a, 'value2' AS b, 'value3' AS c));
我没有使用手写值,而是在'IN'
中使用以下查询SELECT * from(
with x as (
SELECT DISTINCT range
FROM test_table
WHERE age = 62 )
select ltrim( max( sys_connect_by_path(range, ','))
keep (dense_rank last order by curr),
',') range
from (select range,
row_number() over (order by range) as curr,
row_number() over (order by range) -1 as prev
from x)
connect by prev = PRIOR curr
start with curr = 1 )
在这种情况下给出了错误。但是当我使用手写值时,它会给出正确的输出。
select * from (select user_id, nvl(count,0) count, nvl(hour,0) hour,nvl(range,0) range,nvl(age,0)
age from test_table)
PIVOT (SUM(count) as sum_count, sum(hour) as sum_hour for (range) IN
(
'10-20','21-30','31-40'
)
) where age = 62 order by userid
我怎样才能动态给出值? 我怎么能这样做。
答案 0 :(得分:2)
游标很慢,我建议尝试在查询中执行此操作,除非没有其他选择(或速度无关紧要)。您可能需要查看:PIVOT / UNPIVOT
可以旋转列(在本例中为“范围”)。
这里有一些PIVOT / UNPIVOT文件和例子:
http://www.oracle-developer.net/display.php?id=506
根据您的上次修改:
很确定你有两个选择:
根据“范围”列中的不同值构建动态sql。
你可能会再次使用游标来构建列名,但至少它只限于不同的范围。
Oracle有一个PIVOT XML命令可供您使用。
请参阅:http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html
然后向下滚动到“XML Type”