Quiero escribir una consulta como esta:
SELECT o.OrderId, MAX(o.NegotiatedPrice, o.SuggestedPrice)
FROM Order o
Pero no es así como MAX
funciona la función, ¿verdad? Es una función agregada, por lo que espera un único parámetro y luego devuelve el MAX de todas las filas.
¿Alguien sabe cómo hacerlo a mi manera?
sql
sql-server
max
skb
fuente
fuente
GREATEST
función; SQLite emula el soporte al permitir múltiples columnas en elMAX
agregado.Respuestas:
Tendría que hacer un
User-Defined Function
si desea tener una sintaxis similar a su ejemplo, pero podría hacer lo que quiere hacer, en línea, con bastante facilidad con unaCASE
declaración, como han dicho los demás.El
UDF
podría ser algo como esto:... y lo llamarías así ...
fuente
Si está utilizando SQL Server 2008 (o superior), esta es la mejor solución:
Todo el crédito y los votos deben ir a la respuesta de Sven a una pregunta relacionada, "¿SQL MAX de varias columnas?"
Yo digo que es la " mejor respuesta " porque:
SELECCIONAR MÁXIMO (a), MÁX (b) DESDE (VALORES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10)) COMO MyTable (a, b)
fuente
Se puede hacer en una línea:
Editar: si se trata de números muy grandes, tendrá que convertir las variables de valor en bigint para evitar un desbordamiento de enteros.
fuente
No lo creo. Quería esto el otro día. Lo más cerca que estuve fue:
fuente
¿Por qué no probar la función IIF (requiere SQL Server 2012 y posterior)
Eso es.
(Sugerencia: tenga cuidado con cualquiera de los dos
null
, ya que el resultadoa>b
será falso siempre que sea nulo. Asíb
será el resultado en este caso)fuente
NULL
, el resultado siempre será el segundo.NULL > 1234
declaración es falsaIIF(a>b, a, COALESCE(b,a))
para dar el valor cuando existe sólo unofuente
Las otras respuestas son buenas, pero si tiene que preocuparse por tener valores NULL, es posible que desee esta variante:
fuente
En SQL Server 2012 o superior, puede usar una combinación de
IIF
yISNULL
(oCOALESCE
) para obtener el máximo de 2 valores.Incluso cuando 1 de ellos es NULL.
O si desea que devuelva 0 cuando ambos son NULL
Fragmento de ejemplo:
Resultado:
Pero si uno necesita SUMAR múltiples valores?
Luego sugiero CRUZAR APLICAR a una agregación de los VALORES.
Esto también tiene el beneficio de que puede calcular otras cosas al mismo tiempo.
Ejemplo:
fuente
Las subconsultas pueden acceder a las columnas desde la consulta externa, por lo que puede utilizar este enfoque para utilizar agregados, como a
MAX
través de las columnas. (Probablemente sea más útil cuando haya una mayor cantidad de columnas involucradas)fuente
VALUES
sintaxis es mejor.SQL Server 2012 introducido
IIF
:Se recomienda manejar NULLs cuando se usa
IIF
, ya queNULL
a ambos lados de la suyaboolean_expression
haráIIF
que devuelvafalse_value
(en lugar deNULL
).fuente
Yo iría con la solución provista por kcrumley. Solo modifíquelo ligeramente para manejar NULL
EDITAR Modificado después del comentario de Mark . Como señaló correctamente en la lógica de 3 valores x> NULL o x <NULL siempre debe devolver NULL. En otras palabras, resultado desconocido.
fuente
Es tan simple como esto:
fuente
fuente
Vaya, acabo de publicar un engaño de esta pregunta ...
La respuesta es que no hay una función integrada como Oracle's Greatest , pero puede lograr un resultado similar para 2 columnas con un UDF, tenga en cuenta que el uso de sql_variant es bastante importante aquí.
kristof
Publicado esta respuesta:
fuente
Aquí hay un ejemplo de caso que debería manejar nulos y funcionará con versiones anteriores de MSSQL. Esto se basa en la función en línea en uno de los ejemplos populares:
fuente
Probablemente no lo haría de esta manera, ya que es menos eficiente que las construcciones CASE ya mencionadas, a menos que, tal vez, haya tenido índices de cobertura para ambas consultas. De cualquier manera, es una técnica útil para problemas similares:
fuente
Para la respuesta anterior con respecto a los números grandes, puede hacer la multiplicación antes de la suma / resta. Es un poco más voluminoso pero no requiere yeso. (No puedo hablar por la velocidad, pero supongo que sigue siendo bastante rápido)
Cambios a
al menos una alternativa si quieres evitar el casting.
fuente
Aquí hay una versión IIF con manejo NULL (basado en la respuesta de Xin):
La lógica es la siguiente, si alguno de los valores es NULL, devuelve el que no es NULL (si ambos son NULL, se devuelve un NULL) De lo contrario, devuelva el mayor.
Lo mismo se puede hacer para MIN.
fuente
Puedes hacer algo como esto:
fuente
fuente
fuente
En su forma más simple ...
fuente
Para SQL Server 2012:
fuente
Aquí está la respuesta de @Scott Langham con un manejo simple de NULL:
fuente
fuente
fuente
VALUES
inline como ese, no estoy seguro de que sea más simple queCASE
oIFF
. Sin embargoAmpliando la respuesta de Xin y suponiendo que el tipo de valor de comparación es INT, este enfoque también funciona:
Esta es una prueba completa con valores de ejemplo:
fuente
En MemSQL haga lo siguiente:
fuente
En Presto puedes usar use
fuente