1

我工作正常的 SQL 查询是

select case month(timestamp_iso(STATUSDATE))
        when 1 then 'January'
        when 2 then 'February'
        when 3 then 'March'
        when 4 then 'April'
        when 5 then 'May'
        when 6 then 'Jun'
        when 7 then 'July'
        when 8 then 'August'
        when 9 then 'September' 
        when 10 then 'October'
        when 11 then 'November'
        when 12 then 'December'
    end as Month, 

    count (case when service='ADSL' then 1 end) as  ADSL,
  AVG (timestampdiff(
  4, 
  char(actualfinish - reportdate))/60.00) as efficiecny



from INCIDENT
where   year(STATUSDATE) = year(current_timestamp) 
group by month(timestamp_iso(STATUSDATE))

我想获得每个月的 ADSL 服务数量(它是通过第一个 COUNT 完成的)以及没有服务 ADSL 的记录的平均时间差(以小时为单位)。所以我必须在 AVG 函数中排除所有带有服务 ADSL 的记录,但我不能把它放在 where 子句中

 where   year(STATUSDATE) = year(current_timestamp) and service!='ADSL' 

因为我的 COUNT 函数需要有 service='ADSL'

如何解决这个问题?

谢谢

4

3 回答 3

3

由于Avg() 聚合函数会忽略空值,因此如果服务为“ADSL”,您可以将表达式设置为空值。然后 Avg() 将忽略这些记录。

   AVG (case when service != 'ADSL'
             then timestampdiff(4, char(actualfinish - reportdate))/60.00) 
             else null
         end) as efficiency

您可以尝试使用coalesce

   COALESCE (AVG (case when service != 'ADSL'
             then timestampdiff(4, char(actualfinish - reportdate))/60.00) 
             else null
         end), 0) as efficiency
于 2012-05-16T12:23:24.500 回答
0

我确信您可以使用一些技巧在一个查询中完成所有这些操作,但这些实际上应该是两个单独的查询,一个计算 ADSL,一个计算非 ADSL 的平均值。如果你真的想在一次往返中完成,你可以做一对子查询,然后加入当月的子查询。整个事情将更具可读性、更快、更易于维护,以及更规范的 SQL。

此外,看起来 DB2 有一个内置函数来返回月份的名称,MONTHNAME:http: //publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql .ref.doc/doc/r0000831.html


好吧,既然你坚持......我对 db2 不是很熟悉,所以语法可能有点不对,但你应该能够做这样的事情:

SELECT avgt.month, countt.data, avgt.data FROM

(SELECT month(timestamp_iso(STATUSDATE)) AS month,count(*) AS data FROM INCIDENT WHERE year(statusdate) = year(current_timestamp) AND service='ADSL' GROUP BY month(timestamp_iso(STATUSDATE))) AS countt

INNER JOIN 

(SELECT month(timestamp_iso(STATUSDATE)) as month,avg(...) AS data FROM INCIDENT WHERE year(statusdate) = year(current_timestamp) AND service!='ADSL' GROUP BY month(timestamp_iso(STATUSDATE))) AS avgt

ON avgt.month=countt.month

另一种方法可能是在 AVG 中有一个案例,如果 service='ADSL' 则给出 NULL。从 AVG 的文档中并不清楚它对 NULL 值的作用,但值得一试。

于 2012-05-16T11:55:02.820 回答
0

在表格中计算AVG工资排除min()和工资。max()

select round(avg(table.salary),2) from table
where table.salary NOT IN ((select min(salary) from table), (select max(salary) from table)) 
于 2019-10-19T18:58:21.373 回答