Si vous utilisez SQL Server 2008 (ou une version ultérieure), voici 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 à la réponse de Sven à une question connexe, "SQL MAX de plusieurs colonnes ?"
Je dis que c'est la "meilleure réponse " parce que :
- Il n'est pas nécessaire de compliquer votre code avec les instructions UNION, PIVOT, UNPIVOT, UDF et les longues déclarations CASE.
- Il n'est pas en proie au problème de la gestion des valeurs nulles, il les gère très bien.
- Il est facile de remplacer le "MAX" par "MIN", "AVG" ou "SUM". Vous pouvez utiliser n'importe quelle fonction d'agrégation pour trouver l'agrégat sur plusieurs colonnes différentes.
- Vous n'êtes pas limité aux noms que j'ai utilisés (c'est-à-dire "AllPrices" et "Price"). Vous pouvez choisir vos propres noms pour qu'ils soient plus faciles à lire et à comprendre pour le prochain.
- Vous pouvez trouver plusieurs agrégats à l'aide des tables dérivées de SQL Server 2008 :
SELECT MAX(a), MAX(b) FROM (VALUES (1, 2), (3, 4), (5, 6) , (7, 8), (9, 10) ) AS MaTable(a, b)