格式化oracle plsql查询的输出

时间:2012-05-03 06:29:37

标签: oracle plsql oracle10g

我有这样的数据集

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

因为你可以看到所有与id 80013727相关的数据在一行中显示而不是在20120429中显示为2。

请告诉我如何实现它。

标题行可以使用dbms_output.put_line打印一次。

嗨,这是你的答案 -

oracle ver 10.2 g

对于唯一的id,subid,日期组合count1和count2需要在一行中显示。 而不是从最顶层的结果集中可以看到的4行。

80013727 20000000431 20120429有2行不同的时间(即015000,030000)

我需要展示

80013727 20000000431 20120429 count1(来自第1行),count1(来自第2行)

80013727 20000000431 20120429 count2(来自第1行),count2(来自第2行)

1 个答案:

答案 0 :(得分: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()来电可能是不必要的;从您的数据中不清楚每个时段是否有多个记录。