我有这样的数据集
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打印一次。
嗨,这是你的答案 -
对于唯一的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行)
答案 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()
来电可能是不必要的;从您的数据中不清楚每个时段是否有多个记录。