2013-02-06 80 views
1

我正在編寫一個報告(爲了簡單起見,用戶端)我想使用oracle查詢將最終導入到excel中的數據聚合在一起,但可能會也會自動運行到打印機,因此處理過程需要在查詢本身完成。Oracle數據透視表和多列排序

我正在使用oracle,版本10.2.0.5.0(從v $實例中選擇版本)。

好的,所以我使用這個查詢;

SELECT substr(arg_string,1,4) node, 
       substr(numtodsinterval(end_time-start_time,'DAY'), 12, 8) dur, 
       row_number() over (order by substr(arg_string,1,4), 
              start_time) rn 
      FROM pro.program_status 
      where prog_name like ('%v8x-6%') 
     and start_time > sysdate - 10; 

其中返回類似於以下內容的數據集;

NODE DUR  RN 
---- -------- ---------- 
s002 00:25:40 1 
s002 00:27:21 2 
s002 00:03:20 3 
s002 00:27:44 4 
... 
s004 00:21:29 22 
s004 00:22:19 23 
s004 00:05:13 24 
s004 00:22:47 25 
... 
s005 00:03:13 42 
s005 00:00:46 43 
s005 00:02:01 44 
s005 00:00:45 45 
... 
s152 00:01:13 1840 

而我的期望輸出如下;

NODE DUR1  DUR2  DUR3 
---- -------- -------- ---------- 
s002 00:25:40 00:27:21 00:03:20 
s004 00:21:29 00:22:19 00:05:13 
s005 00:03:13 00:00:46 00:02:01 
and so on 

我試過以下查詢;

SELECT node, 
     max(CASE WHEN rn = 1 THEN dur ELSE NULL END) dur1, 
     max(CASE WHEN rn = 2 THEN dur ELSE NULL END) dur2, 
     max(CASE WHEN rn = 3 THEN dur ELSE NULL END) dur3 
    FROM (SELECT substr(arg_string,1,4) node, 
       substr(numtodsinterval(end_time-start_time,'DAY'), 12, 8) dur, 
       row_number() over (order by substr(arg_string,1,4), 
              start_time) rn 
      FROM pro.program_status 
      where prog_name like ('%v8x-6%') 
      and start_time > sysdate - 10) 
group by node 
/

然而,這將返回以下結果作爲唯一的「S002」通過這個網站搜索後,但被標記爲1,2和3

NODE DUR1  DUR2  DUR3  
---- -------- -------- -------- 
s002 00:25:40 00:27:21 00:03:20 
s004 
s005 
s009 
and so on 

我敢肯定,我失去了一些東西很明顯,和許多其他我似乎無法正常工作。

更詳細的一點,我不知道每個節點會出現多少次,或者每天會有多少個節點。

在此先感謝。 湯姆

回答

2

嘗試:

SELECT node, 
     max(CASE WHEN rn = 1 THEN dur ELSE NULL END) dur1, 
     max(CASE WHEN rn = 2 THEN dur ELSE NULL END) dur2, 
     max(CASE WHEN rn = 3 THEN dur ELSE NULL END) dur3 
FROM (SELECT substr(arg_string,1,4) node, 
      substr(numtodsinterval(end_time-start_time,'DAY'), 12, 8) dur, 
      row_number() over (partition by substr(arg_string,1,4) 
           order by substr(arg_string,1,4), start_time) rn 
     FROM pro.program_status 
     where prog_name like ('%v8x-6%') 
     and start_time > sysdate - 10) 
group by node 
+0

嗨,馬克,我沒有足夠的聲譽對這裏又投了(今天才加入),但完全沒有的伎倆! – Bryant1003