J'ai deux variables, l'une s'appelle PaidThisMonth
et l'autre s'appelle OwedPast
. Ce sont tous les deux les résultats de certaines sous-requêtes en SQL. Comment puis-je sélectionner le plus petit des deux et le renvoyer sous la forme d'une valeur intitulée PaidForPast
?
La MIN
fonction fonctionne sur les colonnes, pas sur les variables.
tsql
sql-server
Malfist
la source
la source
Réponses:
Cas d'utilisation:
Comme table en ligne valorisée UDF
Usage:
ADDENDA: Ceci est probablement le meilleur pour l'adressage de seulement deux valeurs possibles, s'il y en a plus de deux, considérez la réponse de Craig en utilisant la clause Values.
la source
SQL Server 2012 et 2014 prend en charge la fonction IIF (cont, true, false). Ainsi, pour une sélection minimale, vous pouvez l'utiliser comme
Alors que IIF n'est qu'un raccourci pour écrire
CASE...WHEN...ELSE
, il est plus facile à écrire.la source
IIF
est juste un sucre syntaxique pourCASE...WHEN...ELSE
.Les solutions utilisant CASE, IIF et UDF sont adéquates, mais peu pratiques lorsque l'on étend le problème au cas général en utilisant plus de 2 valeurs de comparaison. La solution généralisée dans SQL Server 2008+ utilise une application étrange de la clause VALUES:
Crédit dû à ce site Web: http://sqlblog.com/blogs/jamie_thomson/archive/2012/01/20/use-values-clause-to-get-the-maximum-value-from-some-columns-sql- serveur-t-sql.aspx
la source
MIN(x*(case x when 0 then null else 1 end))
Je viens d'avoir une situation où je devais trouver le maximum de 4 sélections complexes dans une mise à jour. Avec cette approche, vous pouvez en avoir autant que vous le souhaitez!
Vous pouvez également remplacer les nombres par des sélections supplémentaires
Utilisation plus complexe
Je suis sûr qu'un UDF a de meilleures performances.
la source
Pour MySQL ou PostgreSQL 9.3+, une meilleure façon est d'utiliser les fonctions
LEAST
etGREATEST
.Avec:
GREATEST(value [, ...])
: Renvoie le plus grand argument (valeur maximale) à partir des valeurs fourniesLEAST(value [, ...])
Renvoie le plus petit argument (valeur minimale) à partir des valeurs fourniesLiens de documentation:
la source
Voici une astuce si vous souhaitez calculer le maximum (champ, 0):
renvoie 0 si
field
est négatif, sinon, retournefield
.la source
SELECT @a - ( ABS(@a-@b) + (@a-@b) ) / 2
Utilisez une instruction CASE.
L'exemple B de cette page doit être proche de ce que vous essayez de faire:
http://msdn.microsoft.com/en-us/library/ms181765.aspx
Voici le code de la page:
la source
Utilisez une table temporaire pour insérer la plage de valeurs, puis sélectionnez le min / max de la table temporaire dans une procédure stockée ou UDF. Ceci est une construction de base, alors n'hésitez pas à réviser si nécessaire.
Par exemple:
la source
Cela fonctionne jusqu'à 5 dates et gère les valeurs nulles. Je ne pouvais tout simplement pas le faire fonctionner en tant que fonction en ligne.
la source
En m'appuyant sur la logique / le code brillant de Mathematix et de Scottyc, je soumets:
Bien que le passage de la fonction MIN de scottyc à la fonction MAX ait dû être évident pour moi, ce n'était pas le cas, alors je l'ai résolu et je l'ai inclus ici: SELECT @a + (ABS (@ b- @ a) + ( @ b- @ a)) / 2. Les nombres générés aléatoirement, bien qu'ils ne soient pas des preuves, devraient au moins convaincre les sceptiques que les deux formules sont correctes.
la source