我使用的是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的上述問題,我在互聯網上看到的所有例子都有固定的值列值(在我的情況下)。我如何獲得動態值。以下是前查詢:
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
我該如何動態地給這些值呢? 我該怎麼做。
thanx的響應。我在asp.net中使用它。而數據較少。所以速度不應該成爲問題。我正在嘗試PIVOT,現在我認爲它應該可以工作。 – Pramod 2012-02-27 14:40:40
@Pramod我添加了一些附加說明。 – Timeout 2012-02-29 22:02:56