对下面这段SQL语句SELECT
nvl(round(avg(AVG_DEAL_TIME), 1), 0) as SHEET_AVEPROTIME,
nvl(round(max(MAX_DEAL_TIME), 1), 0) as SHEET_MAXPROTIME,
nvl(round(min(MIN_DEAL_TIME), 1), 0) as SHEET_MINPROTIME
FROM (SELECT
T.SEND_FLAG,
T.DEAL_FLAG,
ROUND(AVG(T.OVER_DATE - T.CREATE_DATE) * 24 * 3600, 1) AVG_DEAL_TIME,
ROUND(MAX(T.OVER_DATE - T.CREATE_DATE) * 24 * 3600, 1) MAX_DEAL_TIME,
ROUND(MIN(T.OVER_DATE - T.CREATE_DATE) * 24 * 3600, 1) MIN_DEAL_TIME
FROM (SELECT *
FROM PG_J_SHEET
WHERE CREATE_DATE BETWEEN
TO_DATE('2010-08-01 00:00:00', 'YYYY-MM-DD HH24:Mi:SS') AND
TO_DATE('2010-08-07 23:59:59', 'YYYY-MM-DD HH24:Mi:SS')) T
GROUP BY T.SEND_FLAG,
T.DEAL_FLAG) G我在外层计算平均时间,最大时间以及最短时间时,如何根据T.DEAL_FLAG来过滤数据,比如,当T.DEAL_FLAG为9的时候,子查询计算出的AVG_DEAL_TIME,MAX_DEAL_TIME和MIN_DEAL_TIME就不计入计算范围。
在线等答案
谢谢
nvl(round(avg(AVG_DEAL_TIME), 1), 0) as SHEET_AVEPROTIME,
nvl(round(max(MAX_DEAL_TIME), 1), 0) as SHEET_MAXPROTIME,
nvl(round(min(MIN_DEAL_TIME), 1), 0) as SHEET_MINPROTIME
FROM (SELECT
T.SEND_FLAG,
T.DEAL_FLAG,
ROUND(AVG(T.OVER_DATE - T.CREATE_DATE) * 24 * 3600, 1) AVG_DEAL_TIME,
ROUND(MAX(T.OVER_DATE - T.CREATE_DATE) * 24 * 3600, 1) MAX_DEAL_TIME,
ROUND(MIN(T.OVER_DATE - T.CREATE_DATE) * 24 * 3600, 1) MIN_DEAL_TIME
FROM (SELECT *
FROM PG_J_SHEET
WHERE CREATE_DATE BETWEEN
TO_DATE('2010-08-01 00:00:00', 'YYYY-MM-DD HH24:Mi:SS') AND
TO_DATE('2010-08-07 23:59:59', 'YYYY-MM-DD HH24:Mi:SS')) T
GROUP BY T.SEND_FLAG,
T.DEAL_FLAG) G我在外层计算平均时间,最大时间以及最短时间时,如何根据T.DEAL_FLAG来过滤数据,比如,当T.DEAL_FLAG为9的时候,子查询计算出的AVG_DEAL_TIME,MAX_DEAL_TIME和MIN_DEAL_TIME就不计入计算范围。
在线等答案
谢谢
解决方案 »
- linux下我想导出表空间下的某个用户下某个表数据
- 获取唯一约束索引列的sql优化问题
- 求助下面的SQL如何写啊?
- 关于存储过程代码中的一些问题
- 用delphi的dbexpress中的SQLStoredProc1调用oracle的存储过程老出现list index out of bound(0)?
- 应用PL/SQL语言编写的ORACLE内嵌的存储过程中,如何使用TRUNCATE TABLE XXX语句?
- Oracle Data Provider for .NET连接数据库问题
- 谁知道哪可以下载Orcale8i/Orcale9i?
- 请教关于索引的问题。
- 难道就没有高手了吗?版主大哥去哪了啊!小弟在次跪求各位帮帮忙!!最后30救命分
- 每隔15分钟求一个平均值
- 求完成类似功能的Sql语句
nvl(round(avg(AVG_DEAL_TIME), 1), 0) as SHEET_AVEPROTIME,
nvl(round(max(MAX_DEAL_TIME), 1), 0) as SHEET_MAXPROTIME,
nvl(round(min(MIN_DEAL_TIME), 1), 0) as SHEET_MINPROTIME
FROM (SELECT
T.SEND_FLAG,
T.DEAL_FLAG,
case when T.DEAL_FLAG<>9 then ROUND(AVG(T.OVER_DATE - T.CREATE_DATE) * 24 * 3600, 1) else 0 end AVG_DEAL_TIME,
case when T.DEAL_FLAG<>9 then ROUND(MAX(T.OVER_DATE - T.CREATE_DATE) * 24 * 3600, 1) else 0 end MAX_DEAL_TIME,
case when T.DEAL_FLAG<>9 then ROUND(MIN(T.OVER_DATE - T.CREATE_DATE) * 24 * 3600, 1) else 0 end MIN_DEAL_TIME
FROM (SELECT *
FROM PG_J_SHEET
WHERE CREATE_DATE BETWEEN
TO_DATE('2010-08-01 00:00:00', 'YYYY-MM-DD HH24:Mi:SS') AND
TO_DATE('2010-08-07 23:59:59', 'YYYY-MM-DD HH24:Mi:SS')) T
GROUP BY T.SEND_FLAG,
T.DEAL_FLAG) G
之前我也用decode在子查询进行过滤试过了,不可行,所以,应该只能从外层过滤
FROM PG_J_SHEET
WHERE CREATE_DATE BETWEEN
TO_DATE('2010-08-01 00:00:00', 'YYYY-MM-DD HH24:Mi:SS') AND
TO_DATE('2010-08-07 23:59:59', 'YYYY-MM-DD HH24:Mi:SS')
在这里把 DEAL_FLAG = 9 的直接去掉不更直接
因为我外层还要统计T.DEAL_FLAG=9的数据啊,呵呵
而且,我的语句的计算思路本身有点问题,我在里面按照一定的条件分组,然后计算出了平均值,我在外层再根据分组条件中的某一个条件再分组并求平均值的时候,直接使用avg肯定是不对的,假设其中一组的平均值是2,另一组的平均值是4,因为每个组的组员个数不同,这样计算出的平均值就是3,而实际上平均值很可能不是3.后来,我将里面的第一个修改为求和,然后在外层也求和,再除以不为空的成员的个数,得到的平均值就是正确的了。