2012-05-03 138 views
0

的輸出我有一個數據集這樣格式化甲骨文plsql的查詢

id  subid  date(in yyyymmdd) time(in hh24miss) count1 count2 
80013727 20000000431 20120429   001500    0  0 
80013727 20000000431 20120429   003000    0  0 
80013729 20000000432 20120429   001500    0  0 
80013729 20000000432 20120429   003000    0  0 
80013728 20000000435 20120429   001500    0  0 
80013728 20000000435 20120429   003000    0  0 

正如你所看到的時間是在15分鐘內增量。我想顯示輸出結果集如下。

id  Date  subid  00:00:00-00:14:59 00:15:00-00:29:59  
80013727 20120429 20000000431 0     0 
80013729 20120429 20000000432 0     0 

,你可以看到我在一個行,而不是2中S與ID 80013727所有所有資料的日期20120429.

請告訴我如何去實現它。

標題行可使用DBMS_OUTPUT.PUT_LINE被印刷一次。

你好這裏是你的答案,

的Oracle版本10.2克

一個獨特的ID,子編號,日期組合COUNT1 COUNT2和需要是在一行中顯示。 而不是從最上面的結果集中可以看到的4行。

80013727 20000000431 20120429有兩行不同的時間(即015000,030000)

我需要顯示

80013727 20000000431 20120429 COUNT1(從第1行),COUNT1(從第2行)

80013727 20000000431 20120429 count2(來自第一行),count2(來自第二行)

+1

這將是有益的,如果你能回答幾個問題:1)什麼版本的Oracle您使用的是? 2)在所需結果集的輸出行中,使用什麼計算來獲取最後兩列中顯示的值?請點擊[oracle]和[plsql]標籤下面的** edit **按鈕來回答這些問題,從而編輯您的問題。謝謝。 –

+0

嗨,這裏是你的答案 - oracle ver 10.2 g 爲唯一的id,subid,日期組合count1和count2需要顯示在一行中。 而不是如果從最上面的結果集可以看到4行。 80013727 20000000431 20120429有兩行不同的時間(即015000,030000) 我需要顯示 80013727 20000000431 20120429 COUNT1(從第1行),COUNT1(從第2行) – redsoxlost

+0

它將使生活更容易爲我們,如果你寫了一個更好的問題。具體來說,請包含示例數據,這些數據說明您希望代碼的工作方式。只有零纔是毫無意義的。此外,你應該適合所需的輸出,以符合你的規則。如果你花時間正確地設置你的問題,你更有可能得到答案。幫助我們來幫助你。 – APC

回答

0

顯然你已經簡化了你的數據和輸出結構。我猜你最終會得到96個數列(儘管我也不會那麼遠)。

with cte as 
    (select * from your_table) 
select id 
     , subid 
     , date 
      , type 
      , sum(c01) as "00:00:00-00:14:59" 
      , sum(c02) as "00:15:00-00:29:59" 
      , sum(c96) as "23:45:00-23:59:59" 
from (
    select id 
      , subid 
      , date 
      , 'C1' type 
      , case when time between 0 and 899 then count1 else 0 end as c01 
      , case when time between 900 and 1799 then count1 else 0 end as c02 
      , case when time between 85500 and 86399 then count1 else 0 end as c96 
from cte 
    union all 
    select id 
      , subid 
      , date 
      , 'C2' type 
      , case when time between 0 and 899 then count2 else 0 end as c01 
      , case when time between 900 and 1799 then count2 else 0 end as c02 
      , case when time between 85500 and 86399 then count2 else 0 end as c96 
    ) 
group by id, subid, date, type 
order by id, subid, date, type 

所以,這使用子查詢保理表達從表中只有一次選擇。它使用case()根據秒的範圍將計數分配給特定時間列。有兩個查詢聚集爲線路1和計數2

sum()呼叫可能是不必要的;從數據中不清楚每個時段是否有多條記錄。