这个周报的sql怎么写,或者提供个好的周报设计

ruirui09171208 2011-02-11 04:06:12
现在用帆软 做报表,涉及到周报,这个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
...全文
330 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruirui09171208 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 oraclefans_ 的回复:]
[/Quote]
[Quote=引用 10 楼 minitoy 的回复:]
[/Quote]

万分感谢,

现在的时间是依据ALARM_TIME这个来排的周,如果某一周没有这个数据,那这一周就缺省了,无法显示

那有没有办法按照传入的开始时间 结束时间这个时间段内所有周的数据,也就是缺省的周让他为0
coolkisses 2011-02-12
  • 打赏
  • 举报
回复
建议加入 begin、end 2个字段,这样方便报表查询。
例如,结合查询参数(开始-结束日期)
week_begin between trunc(开始日期,'d') and trunc(结束日期,'d')

主要的问题,在如何按周统计。 上面已经给出解决方案,查询,就是小case 了。
minitoy 2011-02-11
  • 打赏
  • 举报
回复
+7改成+6就完美了
wolianlin1987 2011-02-11
  • 打赏
  • 举报
回复
CREATE PROCEDURE P_TEST
(
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;
Oraclefans_ 2011-02-11
  • 打赏
  • 举报
回复
---测试数据如下

SQL>
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
Oraclefans_ 2011-02-11
  • 打赏
  • 举报
回复

----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;
wolianlin1987 2011-02-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ruirui09171208 的回复:]
引用 2 楼 ruirui09171208 的回复:
引用 1 楼 wolianlin1987 的回复:
LZ 意思是不是传入一个查询时间,那么必须得出这个查询时间所在的星期内的警告次数?


恩,就是这个时间段内的 所包含的几个周的 警告次数

传入的是一个开始时间 一个结束时间 这个时间段内
[/Quote]







如果2个时间在都处在不同的星期,那么出来就的2个结果 了?如果2个时间处在同一个星期出来就只有一个结果,是这个意思吧?
minitoy 2011-02-11
  • 打赏
  • 举报
回复
统计时间段取的有问题吧.
限定是2号到8号,怎么最后结果是1月31号到2月12号?
ruirui09171208 2011-02-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ruirui09171208 的回复:]
引用 1 楼 wolianlin1987 的回复:
LZ 意思是不是传入一个查询时间,那么必须得出这个查询时间所在的星期内的警告次数?


恩,就是这个时间段内的 所包含的几个周的 警告次数
[/Quote]
传入的是一个开始时间 一个结束时间 这个时间段内
minitoy 2011-02-11
  • 打赏
  • 举报
回复
楼主应该是要把查询时间段再按星期细分下,再以细分的区间进行分组统计
ruirui09171208 2011-02-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wolianlin1987 的回复:]
LZ 意思是不是传入一个查询时间,那么必须得出这个查询时间所在的星期内的警告次数?
[/Quote]

恩,就是这个时间段内的 所包含的几个周的 警告次数
wolianlin1987 2011-02-11
  • 打赏
  • 举报
回复
LZ 意思是不是传入一个查询时间,那么必须得出这个查询时间所在的星期内的警告次数?

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧