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() 集計関数は null を無視するため、サービスが「ADSL」の場合、expression を null に設定できます。Avg() はそれらのレコードを無視します。

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

合体して試すことができます:

   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

これをすべて 1 つのクエリで実行するために使用できるトリックがあると確信していますが、これらは実際には 2 つの別個のクエリである必要があります。1 つは ADSL をカウントし、もう 1 つは非 ADSL の平均を実行します。本当に 1 回の往復で実行したい場合は、1 組のサブクエリを実行してから、その月にサブクエリを結合できます。全体がはるかに読みやすく、高速で、保守が容易になり、さらに正規の 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 に答える