Я пытаюсь написать оператор SELECT, чтобы выбрать сумму поля, но я хочу вернуть сумму чисел меньше 30, а также сумму чисел больше 30. Я понимаю, что могу сделать это с двумя объединенными выборками, но Я надеялся найти "аккуратный" способ сделать это.
Как выбрать сумму чисел меньше 30 и сумму чисел больше 30?
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
+1 Опрятно. Если вам нужна его производительность, я сомневаюсь, что что-то побьет два выбранных вместе.
- person Lieven Keersmaekers; 03.07.2009
Это предполагает, что у вас есть индекс в столбце.
- person Vilx-; 03.07.2009
Я не думаю, что у этого запроса есть проблемы с производительностью. Или, другими словами: нет причин, по которым два отдельных выбора были бы быстрее. И если у вас есть индекс в поле (и поле не равно нулю), этот запрос можно разрешить, просто обратившись к этому индексу.
- person Thilo; 03.07.2009
Это предполагает, что оптимизатор запросов достаточно умен, чтобы сделать это. Если нет, этот запрос выполнит полное сканирование таблицы. Два отдельных SELECT с условием в части WHERE всегда будут использовать индекс, если он доступен. По крайней мере, я так думаю. Я не знаю, какую версию Oracle использует ОП и как работает ее оптимизатор запросов.
- person Vilx-; 03.07.2009
Я подозреваю, что Oracle не заходит так далеко, чтобы проверять, будут ли агрегатные функции возвращать один и тот же результат, независимо от того, включены строки с NULL или нет; гораздо более вероятно, что это вызовет FTS, если вы не добавите WHERE Field IS NOT NULL, что я бы рекомендовал здесь.
- person Jeffrey Kemp; 03.07.2009
Да, проверено с 11g — Oracle будет настаивать на FTS, если вы явно не исключите строки с NULL.
- person Jeffrey Kemp; 03.07.2009
Вы можете добавить предложение 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