Как выбрать сумму чисел меньше 30 и сумму чисел больше 30?

Я пытаюсь написать оператор SELECT, чтобы выбрать сумму поля, но я хочу вернуть сумму чисел меньше 30, а также сумму чисел больше 30. Я понимаю, что могу сделать это с двумя объединенными выборками, но Я надеялся найти "аккуратный" способ сделать это.


person Community    schedule 03.07.2009    source источник
comment
Я так понимаю, вас ничего не интересует, если сумма равна 30.   -  person pjp    schedule 03.07.2009
comment
Сумма как в SUM по строкам? Вы имеете в виду ‹› 30 на самом деле?   -  person gbn    schedule 03.07.2009


Ответы (3)


Что-то в этом роде (исправьте синтаксис для вашей среды):

SELECT
    sum(case when Field < 30 then Field else 0 end) as LessThan30,
    sum(case when Field > 30 then Field else 0 end) as MoreThan30
FROM
    DaTable
person Vilx-    schedule 03.07.2009
comment
+1 Опрятно. Если вам нужна его производительность, я сомневаюсь, что что-то побьет два выбранных вместе. - person Lieven Keersmaekers; 03.07.2009
comment
Это предполагает, что у вас есть индекс в столбце. - person Vilx-; 03.07.2009
comment
Я не думаю, что у этого запроса есть проблемы с производительностью. Или, другими словами: нет причин, по которым два отдельных выбора были бы быстрее. И если у вас есть индекс в поле (и поле не равно нулю), этот запрос можно разрешить, просто обратившись к этому индексу. - person Thilo; 03.07.2009
comment
Это предполагает, что оптимизатор запросов достаточно умен, чтобы сделать это. Если нет, этот запрос выполнит полное сканирование таблицы. Два отдельных SELECT с условием в части WHERE всегда будут использовать индекс, если он доступен. По крайней мере, я так думаю. Я не знаю, какую версию Oracle использует ОП и как работает ее оптимизатор запросов. - person Vilx-; 03.07.2009
comment
Я подозреваю, что Oracle не заходит так далеко, чтобы проверять, будут ли агрегатные функции возвращать один и тот же результат, независимо от того, включены строки с NULL или нет; гораздо более вероятно, что это вызовет FTS, если вы не добавите WHERE Field IS NOT NULL, что я бы рекомендовал здесь. - person Jeffrey Kemp; 03.07.2009
comment
Да, проверено с 11g — Oracle будет настаивать на FTS, если вы явно не исключите строки с NULL. - person Jeffrey Kemp; 03.07.2009
comment
Вы можете добавить предложение where: где поле не равно нулю, а поле != 30 Может помочь, если поле равно 30 для большинства записей и в поле есть индекс. - person Pop; 03.07.2009

Требование очень расплывчатое, но я предполагаю СУММУ по строкам и ‹> 30. Это отличается от ответа в случае.

SELECT
    SelectCol1, SelectCol2, SelectCol3, ..., SUM(AggregateCol)
FROM
    Table
GROUP BY
    SelectCol1, SelectCol2, SelectCol3, ...
HAVING
    SUM(AggregateCol) <> 30
person gbn    schedule 03.07.2009

Если я правильно понимаю, у вас есть один столбец с числовыми значениями, и вы хотите найти сумму этого поля для всех строк, где значение поля меньше 30, и такое же условие с изменением значения поля больше 30. Если это правильно, то вы можете использовать приведенный ниже запрос и соответственно заменить имя таблицы и столбца.

SELECT  SUM(CASE        WHEN col1 < 30 THEN COL1        ELSE 0 END
       )    SUM(CASE        WHEN col1 < 30 THEN COL1        ELSE 0 END
       ) FROM   DATABASE.SCHEMANAME.TABLE

Спасибо, Атул

person Atul    schedule 03.07.2009