现在用帆软 做报表,涉及到周报,这个sql该怎么写表名:ALARM_HISTROY
这个表里有这么几个关键字段,BUILD_CODE,DEVICE_CODE,ALARM_TIME每一条记录表示,每个DEVICE_CODE在时间ALARM_TIME时候产生了一条告警记录(ALARM_TIME
到秒级)而每一个BUILD_CODE包含最多256个DEVICE_CODE(这个表把关联放到一起了,不考虑是否合理)现在要做的是,按照所选的开始时间begin和结束时间end,在这个时间段内,按照周,统计给定的BUILD_CODE每一周里所产生的告警次数
比如 所选begin为2011-02-02,end为2012-02-08
begin的一周是从2010/01/31(周日)到2011/02/05(周六)
end的一周是从2010/02/06(周日)到2011/02/12(周六) 格式:时间 楼宇 次数
2010/01/31-2011/02/05 0001 25
2010/02/06-2011/02/12 0001 25
这个表里有这么几个关键字段,BUILD_CODE,DEVICE_CODE,ALARM_TIME每一条记录表示,每个DEVICE_CODE在时间ALARM_TIME时候产生了一条告警记录(ALARM_TIME
到秒级)而每一个BUILD_CODE包含最多256个DEVICE_CODE(这个表把关联放到一起了,不考虑是否合理)现在要做的是,按照所选的开始时间begin和结束时间end,在这个时间段内,按照周,统计给定的BUILD_CODE每一周里所产生的告警次数
比如 所选begin为2011-02-02,end为2012-02-08
begin的一周是从2010/01/31(周日)到2011/02/05(周六)
end的一周是从2010/02/06(周日)到2011/02/12(周六) 格式:时间 楼宇 次数
2010/01/31-2011/02/05 0001 25
2010/02/06-2011/02/12 0001 25
解决方案 »
- oracle分页时遇到了怪现象
- No error information available: DB_E_BADACCESSORTYPE(0x80040E4B).
- sql语句怎么拼能满足这个功能
- ORACLE的存储过程,怎样调用JAVA的类啊?
- Oracle10g在linux下的安装问题,急急急!!!
- 请问从sql server 2000把数据导入oracle 9i,哪些字段类型不能导??
- 请问:oracle盗版可以装在正版的系统(window advance 2000)吗?进者得分 !
- 请问Oracle里面如何用存储过程填充.Net里面的DataSet?
- 关于oracle8.1.6的乱码问题
- 关于PK和INDEX讨论,参与讨论给分,截止8.8
- oracle的lincense问题
- oracle怎么给列添加自动增长值?
----try it
select trunc(ALARM_TIME, 'd') || '-' || trunc(ALARM_TIME, 'd') + 7,
BUILD_CODE,
count(DEVICE_CODE)
from LARM_HISTROY
group by trunc(ALARM_TIME, 'd'), BUILD_CODE;
SQL> with LARM_HISTROY as
2 (
3 select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-01-31' ALARM_TIME from dual union all
4 select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-01' ALARM_TIME from dual union all
5 select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-02' ALARM_TIME from dual union all
6 select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-03' ALARM_TIME from dual union all
7 select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-04' ALARM_TIME from dual union all
8 select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-05' ALARM_TIME from dual union all
9 select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-06' ALARM_TIME from dual union all
10 select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-07' ALARM_TIME from dual union all
11 select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-08' ALARM_TIME from dual union all
12 select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-09' ALARM_TIME from dual union all
13 select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-10' ALARM_TIME from dual union all
14 select '0001' BUILD_CODE,1 DEVICE_CODE,date '2011-02-11' ALARM_TIME from dual
15 )
16 select trunc(ALARM_TIME, 'd') || '-' || (trunc(ALARM_TIME, 'd') + 7),
17 BUILD_CODE,
18 count(DEVICE_CODE)
19 from LARM_HISTROY
20 group by trunc(ALARM_TIME, 'd'), BUILD_CODE;TRUNC(ALARM_TIME,'D')||'-'||(T BUILD_CODE COUNT(DEVICE_CODE)
------------------------------ ---------- ------------------
30-1月 -11-06-2月 -11 0001 6
06-2月 -11-13-2月 -11 0001 6
(
v_beg_date DATE,
v_end_Date DATE
) IS
V_DATE NUMBER;
--结果表rpt_res
BEGIN
--判断2个时间是否处在同一星期
SELECT v_beg_date - v_end_Date
INTO V_DATE
FROM dual;
--如果大于7说明不在同一周期有2条结果
IF v_date >= 7 THEN
INSERT INTO rpt_res
SELECT BUILD_CODE,
COUNT(DEVICE_CODE)
FROM LARM_HISTROY
WHERE ALARM_TIME >= trunc(v_beg_date, 'D')
AND ALARM_TIME < trunc(v_beg_date, 'D') + 7
GROUP BY BUILD_CODE;
UNION ALL
SELECT BUILD_CODE,
COUNT(DEVICE_CODE)
FROM LARM_HISTROY
WHERE ALARM_TIME >= trunc(v_end_Date, 'D')
AND ALARM_TIME < trunc(v_end_Date, 'D') + 7
GROUP BY BUILD_CODE;
COMMIT;
END IF;
--如果小于7则在同一星期自由一条结果
IF v_date < 7 THEN
INSERT INTO rpt_res
SELECT BUILD_CODE,
COUNT(DEVICE_CODE)
FROM LARM_HISTROY
WHERE ALARM_TIME >= trunc(v_beg_date, 'D')
AND ALARM_TIME < trunc(v_beg_date, 'D') + 7
GROUP BY BUILD_CODE;
END IF;END;
例如,结合查询参数(开始-结束日期)
week_begin between trunc(开始日期,'d') and trunc(结束日期,'d')主要的问题,在如何按周统计。 上面已经给出解决方案,查询,就是小case 了。
万分感谢,现在的时间是依据ALARM_TIME这个来排的周,如果某一周没有这个数据,那这一周就缺省了,无法显示那有没有办法按照传入的开始时间 结束时间这个时间段内所有周的数据,也就是缺省的周让他为0