2016-04-15 2 views
0

Я новичок в Oracle DB, и я пытаюсь написать запрос, который будет считать SUM строк, у которых есть поле AWARD между 3 и 4, однако тогда мне нужно разделить их на COUNT() все строки. Это означает, что я должен рассчитывать даже строки, в которых AWARD = 1,0, -1 и т.д.Sql division 2 aggregate fucntions

Вот мой запрос, который я пытался использовать:

SELECT SUM(AWARD)/COUNT(*) FROM EVALUATION 
WHERE AWARD BETWEEN 2 AND 4 ; 

Однако, я понимаю, что я получаю COUNT только для строк, которые подходят для предложения WHERE. Что мне делать? Кроме того, мне нужно добавить SUM AWARD со значением 2, однако, всего 50%.

+0

использовать подзапрос для разделения. – SomeJavaGuy

+0

@kevinEsche может предоставить пример? – quento

+0

Oracle поддерживает 'Avg()': https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions011.htm –

ответ

3

Вы можете использовать условную агрегацию с AVG():

SELECT AVG(CASE WHEN AWARD BETWEEN 2 AND 4 THEN AWARD ELSE 0 END) 
FROM EVALUATION; 

Конечно, вы можете сделать Деление себя, если вы действительно, действительно хотите:

SELECT SUM(CASE WHEN AWARD BETWEEN 2 AND 4 THEN AWARD ELSE 0 END)/COUNT(*) 
FROM EVALUATION; 

EDIT (в ответ на комментарий):

SELECT AVG(CASE WHEN AWARD = 2 THEN AWARD/2 
       WHEN AWARD BETWEEN 2 AND 4 THEN AWARD -- although 2 matches, it is caught in the first condition 
       ELSE 0 
      END) 
FROM EVALUATION; 
+0

спасибо! Я нашел первое решение гораздо более элегантным. Не могли бы вы помочь мне с 50% стоимости в случае AWARD = 2? – quento

+0

это будет: КОГДА AWARD = 2 THEN AWARD/2 – quento

1

Попробуйте

SELECT SUM(CASE WHEN AWARD BETWEEN 2 AND 4 THEN AWARD ELSE 0 END)/COUNT(*) 
FROM EVALUATION