Tengo dos variables, una se llama PaidThisMonth
y la otra se llama OwedPast
. Ambos son resultados de algunas subconsultas en SQL. ¿Cómo puedo seleccionar el más pequeño de los dos y devolverlo como un valor titulado PaidForPast
?
La MIN
función funciona en columnas, no en variables.
tsql
sql-server
Malfist
fuente
fuente
Respuestas:
Caso de uso:
Como tabla en línea valorada UDF
Uso:
APÉNDICE: Esto probablemente sea mejor para abordar solo dos valores posibles, si hay más de dos, considere la respuesta de Craig usando la cláusula Values.
fuente
SQL Server 2012 y 2014 admite la función IIF (cont, verdadero, falso). Por lo tanto, para una selección mínima, puede usarlo como
Si bien IIF es solo una abreviatura para escribir
CASE...WHEN...ELSE
, es más fácil de escribir.fuente
IIF
es solo un azúcar sintáctico paraCASE...WHEN...ELSE
.Las soluciones que utilizan CASE, IIF y UDF son adecuadas, pero poco prácticas cuando se extiende el problema al caso general utilizando más de 2 valores de comparación. La solución generalizada en SQL Server 2008+ utiliza una aplicación extraña de la cláusula VALUES:
Crédito debido a este sitio web: http://sqlblog.com/blogs/jamie_thomson/archive/2012/01/20/use-values-clause-to-get-the-maximum-value-from-some-columns-sql- server-t-sql.aspx
fuente
MIN(x*(case x when 0 then null else 1 end))
Acabo de tener una situación en la que tuve que encontrar el máximo de 4 selecciones complejas dentro de una actualización. ¡Con este enfoque puedes tener tantos como quieras!
También puede reemplazar los números con selecciones adicionales
Uso mas complejo
Estoy seguro de que un UDF tiene un mejor rendimiento.
fuente
Para MySQL o PostgreSQL 9.3+, una mejor manera es usar las funciones
LEAST
yGREATEST
.Con:
GREATEST(value [, ...])
: Devuelve el argumento más grande (valor máximo) de los valores proporcionadosLEAST(value [, ...])
Devuelve el argumento más pequeño (valor mínimo) de los valores proporcionadosEnlaces de documentación:
fuente
Aquí hay un truco si desea calcular el máximo (campo, 0):
devuelve 0 si
field
es negativo, de lo contrario, devuelvefield
.fuente
SELECT @a - ( ABS(@a-@b) + (@a-@b) ) / 2
Use una declaración CASE.
El ejemplo B en esta página debe estar cerca de lo que está intentando hacer:
http://msdn.microsoft.com/en-us/library/ms181765.aspx
Aquí está el código de la página:
fuente
Use una tabla temporal para insertar el rango de valores, luego seleccione el mínimo / máximo de la tabla temporal desde un procedimiento almacenado o UDF. Esta es una construcción básica, así que siéntase libre de revisar según sea necesario.
Por ejemplo:
fuente
Esto funciona para hasta 5 fechas y maneja nulos. Simplemente no pude hacerlo funcionar como una función en línea.
fuente
Partiendo de la brillante lógica / código de Mathix y Scottyc, presento:
Aunque el salto de la función MIN de scottyc a la función MAX debería haber sido obvio para mí, no lo fue, así que lo resolví y lo incluí aquí: SELECT @a + (ABS (@ b- @ a) + ( @ b- @ a)) / 2. Los números generados aleatoriamente, aunque no son una prueba, al menos deberían convencer a los escépticos de que ambas fórmulas son correctas.
fuente