sql - display the count of the rows created in each hour in last day with 0 count when rows are not created -
i have table below.
 date             |name |number  5/11/2016 17:00:50| abc |123  5/11/2016 18:00:05| def |456  5/11/2016 18:15:00 |ghi |789 i have display count of rows created in each hour in last day. , when no rows created in hour, should display count 0. have limitation of not use pl/sql or multiple queries.
i have tried below query, problem is howing both rows of count 0 , count
select trunc(sysdate ,'hh')  - level/24 dates , 0 count dual connect level <= 24 union   select  trunc (date, 'hh') dates, count(*) count   table    date> sysdate -1   group trunc (date, 'hh') .
date              |count 04-nov-16 08.00.00  |0 04-nov-16 09.00.00  |0 04-nov-16 10.00.00  |0 04-nov-16 11.00.00  |0 05-nov-16 12.00.00  |0 05-nov-16 01.00.00  |0 05-nov-16 02.00.00  |0 05-nov-16 03.00.00  |0 05-nov-16 04.00.00  |0 05-nov-16 05.00.00  |0 05-nov-16 06.00.00  |0 05-nov-16 07.00.00  |0 05-nov-16 08.00.00  |0 05-nov-16 09.00.00  |0 05-nov-16 10.00.00  |0 05-nov-16 11.00.00  |0 05-nov-16 12.00.00  |0 05-nov-16 01.00.00  |0 05-nov-16 02.00.00  |0 05-nov-16 03.00.00  |0 05-nov-16 04.00.00  |0 05-nov-16 05.00.00  |0 05-nov-16 05.00.00  |1 05-nov-16 06.00.00  |0 05-nov-16 06.00.00  |2 05-nov-16 07.00.00  |0 i working on oracle 11g , have display results in single query.
you notice didn't order hh why output looks odd. also, 11 on 5 nov. 0 hours looking back!
the first cte, inputs, testing (it not part of solution). in rest of query, replace inputs actual table name, , same column names (which better not include date , number!)
with      inputs ( dt, name, nbr ) (      select to_date('5/11/2016 17:00:50', 'dd/mm/yyyy hh24:mi:ss'), 'abc', 123 dual         union      select to_date('5/11/2016 18:00:05', 'dd/mm/yyyy hh24:mi:ss'), 'def', 456 dual         union      select to_date('5/11/2016 18:15:00', 'dd/mm/yyyy hh24:mi:ss'), 'ghi', 789 dual      ), -- end test data; solution (sql query) begins here, add word before d (hh)      d ( hh ) (         select trunc(sysdate, 'hh') - level/24 dual connect level <= 24      ) select d.hh, coalesce(i.ct, 0) ct   d left outer join (                       select trunc(dt, 'hh') hh, count(*) ct                         inputs                        dt >= sysdate - 1                       group trunc(dt, 'hh')                                           )          on d.hh = i.hh ;  hh                          ct ------------------- ---------- 2016-11-04 06:00:00          0 2016-11-04 21:00:00          0 2016-11-04 19:00:00          0 2016-11-04 23:00:00          0  [............................]  2016-11-04 10:00:00          0 2016-11-04 22:00:00          0   24 rows selected  
Comments
Post a Comment