2012-02-27 98 views
0

我使用的是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 

我該如何動態地給這些值呢? 我該怎麼做。

回答

2

遊標很慢,我會建議嘗試在查詢中這樣做,除非沒有其他選擇(或速度無關緊要)。你可能想看看:PIVOT/UNPIVOT它可以旋轉列(在這種情況下「範圍」)。

下面是一些PIVOT/UNPIVOT文檔和示例:
http://www.oracle-developer.net/display.php?id=506

基於上次編輯:

敢肯定你有兩種選擇:

  1. 構建動態SQL基於「範圍」列中的不同值。

    您可能會再次使用遊標卡住來構建列名稱,但至少它將被限制在不同的範圍內。

  2. Oracle有一個可用於此的PIVOT XML命令。

    參見:http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html

    ,向下滾動到的部分: 「XML類型」

+0

thanx的響應。我在asp.net中使用它。而數據較少。所以速度不應該成爲問題。我正在嘗試PIVOT,現在我認爲它應該可以工作。 – Pramod 2012-02-27 14:40:40

+0

@Pramod我添加了一些附加說明。 – Timeout 2012-02-29 22:02:56