日期:2014-05-17  浏览次数:20455 次

求一个简洁的报表sql
这是数据


表结构是:
SQL code

create table OM_RT
(
  business_traffic NUMBER,
  finishtime       DATE,
  center_id        VARCHAR2(2)
)



center_id 代表机构号 一共4个机构 01、02、03、04
finishtime 为完成时间
business_traffic 为完成数量


由于需要对应报表工具的需要,需要构建如下的结果集

东公司 西公司 北公司 南公司 时间段
112 234 345 345 08:30-09:00
123 123 455 88 09:00-09:30 
123 466 54 46 09:30-10:00
234 789 645 4646 10:00-10:30
234 446 79 78 10:30-11:00
345 79 456 78 11:00-11:30
345 454 797 45 11:30-12:00
56 455 79 54 12:00-12:30
.  

.
.
.
.
.
. 16:30-17:00



查询页面4个机构为多选框 多选机构后加上系统当前时间为查询条件去查OM_RT表,该表每半小时更新一次,也就是说上午09:00的时候只有08:30--09:30(从08:30开始有数据)的数据,如果17:00(17:00后不再有数据)的时候则有全天的数据。
由于机构不确定,并且需要把查询结果往右叠加,我尝试写了一下,发现非常麻烦,以下是我写的sql

SQL code

select sum(t.BUSINESS_TRAFFIC), '08:30-09:00'
  from OM_MCMS_AUTHLOG_RT t
 where T.FINISHTIME between
       to_date(((SUBSTR(to_char(sysdate, 'yyyy-mm-dd HH:mi:ss'), 1, 11)) ||
               '08:30:00'),
               'yyyy-mm-dd HH:mi:ss') and
       to_date(((SUBSTR(to_char(sysdate, 'yyyy-mm-dd HH:mi:ss'), 1, 11)) ||
               '09:00:00'),
               'yyyy-mm-dd HH:mi:ss')
   and T.CENTER_ID = '02'



这只能查出来一个机构的,我还需要左连接构建其他三个机构

如果多选四个机构 在08:30-09:00 我就需要写四个左连接,如果全天的话,这个sql真的很庞大

有没有高手能指点一下,根据系统当前时间和选择的机构,能查我提供的那张表,展示我描述的结果集,谢谢




------解决方案--------------------
SQL code

--帮你简化下
select 
sum(decode(t.CENTER_ID,'01',t.BUSINESS_TRAFFIC,0)) 东公司,
sum(decode(t.CENTER_ID,'02',t.BUSINESS_TRAFFIC,0)) 西公司,
sum(decode(t.CENTER_ID,'03',t.BUSINESS_TRAFFIC,0)) 北公司,
sum(decode(t.CENTER_ID,'04',t.BUSINESS_TRAFFIC,0)) 南公司,
 '08:30-09:00'
  from OM_MCMS_AUTHLOG_RT t
 where T.FINISHTIME between
       to_date((to_char(sysdate, 'yyyy-mm-dd') ||' 08:30:00'),'yyyy-mm-dd HH:mi:ss') and
       to_date((to_char(sysdate, 'yyyy-mm-dd') ||' 09:00:00'),'yyyy-mm-dd HH:mi:ss');