2012-05-16 1 views
1

моего SQL запрос, который отлично работает вИсключить записи в функции AVG SQL? (Не может использовать WHERE в основном запросе из-за другой граф)

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 year(STATUSDATE) = year(current_timestamp) and service!='ADSL' 

, потому что моя функция COUNT должна иметь обслуживание = «ADSL»

Как решить эту проблему?

Благодаря

ответ

3

Как Avg() aggregate function ignores nulls, вы можете установить выражение равным null, если услуга «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 
+0

Zdravo Nikola, hvala ti ovo izgleda daje tacan rezultat (provericu jos malo) ali da li posto za jedan mesec dobijam vrednost null da li mogu nekako da za tu vrednost dobijem 0. Zato sto mi je potrebno za iscrtavanje grafika da postoji neka vrednost. Hvala – Dejan

+0

Zdravo Dejane, molim te pogledaj dopunjeni odgovor. –

+0

Nikola nazalost nesto me zeza. Dobijam rezultat 0E-18. Ne znam kako ovo moze negativno da utice na iscrtavanje grafika – Dejan

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, что дает NULL, если сервис = «ADSL» , Из документации AVG не очень понятно, что она делает со значениями NULL, но это было бы целесообразно.

+0

Спасибо за ответ, но мне действительно нужно это в одном query.Do и знаю, как возможно? Потому что мне нужно показать, что результаты в ОДНОЙ таблице в некоторых ОТЧЕТАХ – Dejan

+0

Это почти правильно, но не совсем. Текущий результат - 1 апреля; 6.4 мая 0, 800 Правильный результат будет 1 апреля; 0 мая 0; 800 первый столбец ADSL, вторая эффективность, но, используя ваш запрос, я получаю пустой результат, потому что они не связаны с ON. из-за 0 значений за эти месяцы. Я полагаю, что ему нужна только небольшая коррекция. – Dejan