当前位置: 代码迷 >> Sql Server >> 简洁的报表sql
  详细解决方案

简洁的报表sql

热度:58   发布时间:2016-04-27 10:43:27.0
求一个简洁的报表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');
  相关解决方案