Je veux écrire une requête comme celle-ci:
SELECT o.OrderId, MAX(o.NegotiatedPrice, o.SuggestedPrice)
FROM Order o
Mais ce n'est pas ainsi que la MAX
fonction fonctionne, non? Il s'agit d'une fonction d'agrégation, elle attend donc un seul paramètre, puis retourne le MAX de toutes les lignes.
Est-ce que quelqu'un sait comment le faire à ma façon?
sql
sql-server
max
skb
la source
la source
GREATEST
fonction; SQLite émule la prise en charge en autorisant plusieurs colonnes dans l'MAX
agrégat.Réponses:
Vous auriez besoin de faire un
User-Defined Function
si vous vouliez avoir une syntaxe similaire à votre exemple, mais pourriez-vous faire ce que vous voulez faire, en ligne, assez facilement avec uneCASE
déclaration, comme les autres l'ont dit.Le
UDF
pourrait être quelque chose comme ceci:... et tu appellerais ça comme ça ...
la source
Si vous utilisez SQL Server 2008 (ou supérieur), voici la meilleure solution:
Tous les crédits et votes devraient aller à la réponse de Sven à une question connexe, "SQL MAX de plusieurs colonnes?"
Je dis que c'est la " meilleure réponse " car:
SELECT MAX (a), MAX (b) FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10)) COMME MyTable (a, b)
la source
Peut se faire en une seule ligne:
Edit: Si vous avez affaire à de très grands nombres, vous devrez convertir les variables de valeur en bigint afin d'éviter un débordement d'entier.
la source
Je ne pense pas. Je le voulais l'autre jour. Le plus proche que j'ai obtenu était:
la source
Pourquoi ne pas essayer la fonction IIF (nécessite SQL Server 2012 et versions ultérieures)
C'est ça.
(Astuce: soyez prudent dans les deux cas
null
, car le résultat dea>b
sera faux chaque fois que l'un ou l'autre est nul. Il enb
sera de même dans ce cas)la source
NULL
, le résultat sera toujours le second.NULL > 1234
déclaration est fausseIIF(a>b, a, COALESCE(b,a))
donner la valeur quand il n'y en a qu'unela source
Les autres réponses sont bonnes, mais si vous devez vous soucier d'avoir des valeurs NULL, vous voudrez peut-être cette variante:
la source
Dans SQL Server 2012 ou version ultérieure, vous pouvez utiliser une combinaison de
IIF
etISNULL
(ouCOALESCE
) pour obtenir le maximum de 2 valeurs.Même lorsque l'un d'eux est NULL.
Ou si vous voulez qu'il renvoie 0 lorsque les deux sont NULL
Exemple d'extrait:
Résultat:
Mais si l'on doit additionner plusieurs valeurs?
Ensuite, je suggère de CROSS APPLIQUER à une agrégation des VALEURS.
Cela a également l'avantage de pouvoir calculer d'autres choses en même temps.
Exemple:
la source
Les sous-requêtes peuvent accéder aux colonnes à partir de la requête externe, vous pouvez donc utiliser cette approche pour utiliser des agrégats tels que
MAX
sur plusieurs colonnes. (Probablement plus utile quand il y a un plus grand nombre de colonnes impliquées)la source
VALUES
syntaxe est plus agréable.SQL Server 2012 a introduit
IIF
:La manipulation des valeurs NULL est recommandée lors de l'utilisation
IIF
, car unNULL
de chaque côté de votreboolean_expression
volonté provoqueraIIF
le retour defalse_value
(par opposition àNULL
).la source
J'irais avec la solution fournie par kcrumley Il suffit de la modifier légèrement pour gérer les NULLs
EDIT Modifié après commentaire de Mark . Comme il l'a correctement souligné dans 3 logiques de valeur, x> NULL ou x <NULL doit toujours retourner NULL. En d'autres termes, résultat inconnu.
la source
C'est aussi simple que cela:
la source
la source
Oups, je viens de poster une dupe de cette question ...
La réponse est qu'il n'y a pas de fonction intégrée comme Oracle's Greatest , mais vous pouvez obtenir un résultat similaire pour 2 colonnes avec un UDF, notez que l'utilisation de sql_variant est assez importante ici.
kristof
Publié cette réponse:
la source
Voici un exemple de cas qui devrait gérer les valeurs nulles et fonctionnera avec les anciennes versions de MSSQL. Ceci est basé sur la fonction inline dans l'un des exemples populaires:
la source
Je ne le ferais probablement pas de cette façon, car il est moins efficace que les constructions CASE déjà mentionnées - sauf si, peut-être, vous aviez des index de couverture pour les deux requêtes. Quoi qu'il en soit, c'est une technique utile pour des problèmes similaires:
la source
Pour la réponse ci-dessus concernant les grands nombres, vous pouvez faire la multiplication avant l'addition / soustraction. C'est un peu plus volumineux mais ne nécessite aucun casting. (Je ne peux pas parler de vitesse mais je suppose que c'est toujours assez rapide)
Modifications apportées à
au moins une alternative si vous voulez éviter de lancer.
la source
Voici une version IIF avec une gestion NULL (basée sur la réponse de Xin):
La logique est la suivante, si l'une des valeurs est NULL, retourne celle qui n'est pas NULL (si les deux sont NULL, un NULL est retourné). Sinon, renvoyez le plus grand.
La même chose peut être faite pour MIN.
la source
Vous pouvez faire quelque chose comme ça:
la source
la source
la source
Dans sa forme la plus simple ...
la source
Pour SQL Server 2012:
la source
Voici la réponse de @Scott Langham avec une gestion NULL simple:
la source
la source
la source
VALUES
inline comme ça, je ne suis pas sûr que ce soit plus simple queCASE
ouIFF
. Je serais intéressé de voir comment les performances de cette solution se comparent aux autres optionsEn développant la réponse de Xin et en supposant que le type de valeur de comparaison est INT, cette approche fonctionne également:
Il s'agit d'un test complet avec des exemples de valeurs:
la source
Dans MemSQL, procédez comme suit:
la source
Dans Presto, vous pouvez utiliser
la source