2012-05-03 106 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()呼叫可能是不必要的;从数据中不清楚每个时段是否有多条记录。