求过滤数据方法

vjrmlio 2010-08-18 01:19:57
对下面这段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就不计入计算范围。
在线等答案
谢谢
...全文
148 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
vjrmlio 2010-08-18
  • 打赏
  • 举报
回复
现在问题解决了,确实是用case when,但是,这里当T.DEAL_FLAG=9的时候,需将其值设为null,而不是设为0,如此一来,我在外层再进行平均、求最大和最小值的计算的时候,null值不参与运算,就不会出错了。
而且,我的语句的计算思路本身有点问题,我在里面按照一定的条件分组,然后计算出了平均值,我在外层再根据分组条件中的某一个条件再分组并求平均值的时候,直接使用avg肯定是不对的,假设其中一组的平均值是2,另一组的平均值是4,因为每个组的组员个数不同,这样计算出的平均值就是3,而实际上平均值很可能不是3.后来,我将里面的第一个修改为求和,然后在外层也求和,再除以不为空的成员的个数,得到的平均值就是正确的了。
minitoy 2010-08-18
  • 打赏
  • 举报
回复
从头看到尾没看明白是什么要求
wswfan 2010-08-18
  • 打赏
  • 举报
回复
用having能不能实现?
vjrmlio 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 java3344520 的回复:]
用CASE WHEN 语句
[/Quote]

嘿嘿,大大你详细点嘿
kingkingzhu 2010-08-18
  • 打赏
  • 举报
回复
贴表格 数据 和 需求吧
iqlife 2010-08-18
  • 打赏
  • 举报
回复
用CASE WHEN 语句
vjrmlio 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kingkingzhu 的回复:]
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')
在这里把 DEAL_FLAG = 9 的……
[/Quote]

因为我外层还要统计T.DEAL_FLAG=9的数据啊,呵呵
kingkingzhu 2010-08-18
  • 打赏
  • 举报
回复
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')
在这里把 DEAL_FLAG = 9 的直接去掉不更直接
vjrmlio 2010-08-18
  • 打赏
  • 举报
回复
谢谢2楼的,但是结果不正确,在里面过滤的话,到了外层,对于存在T.DEAL_FLAG=9的工单,最短时间就全部变为0了,这是不符合实际的。
之前我也用decode在子查询进行过滤试过了,不可行,所以,应该只能从外层过滤
duanzhi1984 2010-08-18
  • 打赏
  • 举报
回复
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,
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

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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