Eu tenho duas variáveis, uma é chamada PaidThisMonth
e a outra é chamada OwedPast
. Ambos são resultados de algumas subconsultas no SQL. Como posso selecionar o menor dos dois e retorná-lo como um valor intitulado PaidForPast
?
A MIN
função funciona em colunas, não em variáveis.
tsql
sql-server
Malfist
fonte
fonte
Respostas:
Caso de uso:
Como tabela Inline com valor UDF
Uso:
ADENDO: Provavelmente é melhor para quando abordar apenas dois valores possíveis, se houver mais de dois, considere a resposta de Craig usando a cláusula Values.
fonte
O SQL Server 2012 e 2014 oferece suporte à função IIF (cont, true, false). Assim, para uma seleção mínima, você pode usá-lo como
Embora o IIF seja apenas um atalho para escrever
CASE...WHEN...ELSE
, é mais fácil escrever.fonte
IIF
é apenas um açúcar sintático paraCASE...WHEN...ELSE
.As soluções que utilizam CASE, IIF e UDF são adequadas, mas impraticáveis ao estender o problema ao caso geral usando mais de 2 valores de comparação. A solução generalizada no SQL Server 2008+ utiliza um aplicativo estranho da cláusula VALUES:
Crédito devido a este site: 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
fonte
MIN(x*(case x when 0 then null else 1 end))
Eu apenas tive uma situação em que tive que encontrar o máximo de 4 seleções complexas em uma atualização. Com essa abordagem, você pode ter quantas quiser!
Você também pode substituir os números por seleções adicionais
Uso mais complexo
Tenho certeza que um UDF tem melhor desempenho.
fonte
Para MySQL ou PostgreSQL 9.3+, uma maneira melhor é usar as funções
LEAST
eGREATEST
.Com:
GREATEST(value [, ...])
: Retorna o maior argumento (com valor máximo) dos valores fornecidosLEAST(value [, ...])
Retorna o menor argumento (com valor mínimo) dos valores fornecidosLinks para documentação:
fonte
Aqui está um truque se você deseja calcular o máximo (campo, 0):
retorna 0 se
field
for negativo; caso contrário, retornefield
.fonte
SELECT @a - ( ABS(@a-@b) + (@a-@b) ) / 2
Use uma instrução CASE.
O exemplo B desta página deve estar próximo do que você está tentando fazer:
http://msdn.microsoft.com/en-us/library/ms181765.aspx
Aqui está o código da página:
fonte
Use uma tabela temporária para inserir o intervalo de valores e selecione o mínimo / máximo da tabela temporária em um procedimento armazenado ou UDF. Essa é uma construção básica, portanto, fique à vontade para revisar conforme necessário.
Por exemplo:
fonte
Isso funciona por até 5 datas e lida com nulos. Apenas não conseguia fazê-lo funcionar como uma função embutida.
fonte
Com base na lógica / código brilhante de mathematix e scottyc, eu envio:
Embora o salto da função MIN do scottyc para a função MAX deva ter sido óbvio para mim, não foi, então resolvi fazer isso e o incluí aqui: SELECT @a + (ABS (@ b- @ a) + ( @ b- @ a)) / 2. Os números gerados aleatoriamente, embora não sejam prova, devem pelo menos convencer os céticos de que ambas as fórmulas estão corretas.
fonte