573 votes

Y a-t-il une fonction Max dans SQL Server qui prend deux valeurs comme Math.Max dans .NET ?

Je veux écrire une requête comme ceci :

Mais ce n’est pas comment le `` fonctionne, droite ? C’est une fonction d’agrégation, il attend un seul paramètre et retourne ensuite le MAX de toutes les lignes.

Quelqu'un sait-il comment faire mon chemin ?

535voto

MikeTeeVee Points 3578

Si vous utilisez SQL Server 2008 (ou ci-dessus), alors que c'est la meilleure solution:

SELECT o.OrderId,
       (SELECT MAX(Price)
        FROM (VALUES (o.NegotiatedPrice),(o.SuggestedPrice)) AS AllPrices(Price))
FROM Order o

Tout le crédit et les votes doivent aller à Sven, en réponse à une question relative à la "SQL MAX de plusieurs colonnes?"
Je dis que c'est la "meilleure réponse" parce que:

  1. Il ne nécessite pas de compliquer votre code à l'aide de l'UNION, PIVOT, UNPIVOT, UDF, et fou-le CAS des relevés.
  2. Ce n'est pas aux prises avec le problème de la manipulation des valeurs nulles, il gère très bien.
  3. Il est facile de changer de "MAX" avec "MIN", "AVG", ou "SOMME". Vous pouvez utiliser n'importe quelle fonction d'agrégation pour trouver la somme sur plusieurs colonnes différentes.
  4. Vous n'êtes pas limité à, les noms que j'ai utilisé (c'est à dire "AllPrices" et "Prix"). Vous pouvez choisir vos propres noms pour les rendre plus faciles à lire et à comprendre pour le gars à côté.
  5. Vous pouvez trouver plusieurs agrégats à l'aide de SQL Server 2008 derived_tables comme suit:
    SELECT MAX(a), MAX(b) à PARTIR de (VALEURS (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) COMME MyTable(a, b)

243voto

splattne Points 48126

Peut être fait en une seule ligne :

Edit : Si vous avez affaire à un très grand nombre, vous devrez convertir les variables valeur bigint afin d’éviter un dépassement d’entier.

180voto

kcrumley Points 2495

Vous auriez besoin de faire un si vous voulez avoir syntaxe semblable à votre exemple, mais pourriez-vous faire ce que vous voulez faire, "inline", assez facilement avec un déclaration, comme les autres l’ont dit.

Le `` pourrait être quelque chose comme ceci :

... et vous appellera comme suit...

134voto

Scott Langham Points 17447

Je ne pense pas. J’ai voulu que cette l’autre jour. Était le plus proche, j’ai obtenu :

35voto

jbeanky Points 191
DECLARE @MAX INT
@MAX = (SELECT MAX(VALUE) 
               FROM (SELECT 1 AS VALUE UNION 
                     SELECT 2 AS VALUE) AS T1)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X