0

我有一个这样的数据集

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 打印一次。

你好,这是你的答案-

甲骨文 10.2 克

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

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

我需要展示

80013727 20000000431 20120429 count1(从第一行开始),count1(从第二行开始)

80013727 20000000431 20120429 count2(从第一行开始),count2(从第二行开始)

4

1 回答 1

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()电话可能是不必要的;从您的数据中不清楚您在每个时间段是否有多个记录。

于 2012-05-07T13:07:41.767 回答