У меня есть две переменные, одна называется PaidThisMonth
, а другая называется OwedPast
. Оба они являются результатами некоторых подзапросов в SQL. Как я могу выбрать меньшее из двух и вернуть его в качестве значения с названием PaidForPast
?
MIN
Функция работает по столбцам, а не переменных.
tsql
sql-server
Malfist
источник
источник
Ответы:
Случай использования:
Как Inline таблица ценится UDF
Использование:
ADDENDUM: Это, вероятно, лучше всего для адресации только двух возможных значений, если их больше двух, рассмотрите ответ Крейга, используя предложение Values.
источник
SQL Server 2012 и 2014 поддерживает функцию IIF (продолжение, истина, ложь). Таким образом, для минимального выбора вы можете использовать его как
В то время как IIF - это просто сокращение для записи
CASE...WHEN...ELSE
, писать легче.источник
IIF
это просто синтаксический сахар дляCASE...WHEN...ELSE
.Решения, использующие CASE, IIF и UDF, являются адекватными, но нецелесообразными при распространении задачи на общий случай с использованием более двух значений сравнения. Обобщенное решение в SQL Server 2008+ использует странное приложение предложения VALUES:
Кредит за этот сайт: http://sqlblog.com/blogs/jamie_thomson/archive/2012/01/20/use-values-clause-to-get-the-maximum-value-from-some-columns-sql- сервер-трет-sql.aspx
источник
MIN(x*(case x when 0 then null else 1 end))
У меня просто была ситуация, когда я должен был найти максимум 4 сложных выбора в обновлении. При таком подходе вы можете иметь столько, сколько захотите!
Вы также можете заменить номера дополнительным выбором
Более сложное использование
Я уверен, что UDF имеет лучшую производительность.
источник
Для MySQL или PostgreSQL 9.3+, лучший способ заключается в использовании
LEAST
иGREATEST
функции.С участием:
GREATEST(value [, ...])
Возвращает самый большой (максимальный) аргумент из предоставленных значений.LEAST(value [, ...])
Возвращает наименьший (минимальный) аргумент из предоставленных значенийСсылки на документацию:
источник
Вот хитрость, если вы хотите вычислить максимум (поле, 0):
возвращает 0, если
field
отрицателен, иначе вернутьfield
.источник
SELECT @a - ( ABS(@a-@b) + (@a-@b) ) / 2
Используйте оператор CASE.
Пример B на этой странице должен быть близок к тому, что вы пытаетесь сделать:
http://msdn.microsoft.com/en-us/library/ms181765.aspx
Вот код со страницы:
источник
Используйте временную таблицу для вставки диапазона значений, затем выберите минимальную / максимальную временную таблицу из хранимой процедуры или пользовательской функции. Это базовая конструкция, поэтому не стесняйтесь пересматривать по мере необходимости.
Например:
источник
Это работает до 5 дат и обрабатывает нули. Просто не мог заставить его работать как встроенная функция.
источник
Основываясь на блестящей логике / коде от Mathematix и Scottyc, я представляю:
Хотя переход с функции scottyc на функцию MIN к функции MAX должен был быть для меня очевиден, этого не произошло, поэтому я решил это и включил здесь: SELECT @a + (ABS (@ b- @ a) + ( @ b- @ a)) / 2. Случайно сгенерированные числа, хотя и не являются доказательством, должны, по крайней мере, убедить скептиков в правильности обеих формул.
источник