Consultas SQL Server III – Máximo/Mínimo de varios valores


Es posible que queramos coger los valores de diferentes columnas para hacer una consulta. Por ejemplo, teniendo la siguiente tabla:

ProductColumnAColumnBColumnC
Alpha157
Bravo342

Siempre podemos hacerlo manualmente:

SELECT row, CASE WHEN ColumnC < ColumnA AND ColumnB < ColumnA THEN ColumnA
                 WHEN ColumnA < ColumnB AND ColumnC < ColumnB THEN ColumnB
                 WHEN ColumnA < ColumnC AND ColumnB < ColumnC THEN ColumnC
  FROM table

Y esto nos daría lo siguiente

alpha, 7
bravo, 4

Pero claro, si tenemos catorce mil columnas o incluso el resultado proviene de un cálculo, tal vez no nos sea tan sencillo. Por ejemplo, pongamos que tenemos que multiplicar por 1.21 para sumar el IVA a los productos

SELECT row, CASE WHEN ColumnC < ColumnA AND ColumnB < ColumnA THEN ColumnA
                 WHEN ColumnA < ColumnB AND ColumnC < ColumnB THEN ColumnB
                 WHEN ColumnA < ColumnC AND ColumnB < ColumnC THEN ColumnC
  FROM (SELECT ColumnA * 1.21 as ColumnA, 
               ColumnB * 1.21 as ColumnB,
               ColumnC * 1.21 as ColumnC
          FROM table) a

La opción B es utilizarlo de la siguiente forma

SELECT row, (SELECT max(res) 
               FROM (VALUES (t.ColumnA * 1.21), 
                            (t.ColumnB * 1.21),
                            (t.ColumnC * 1.21)
                    ) as MyValue(res))
  FROM table t;

Y esto nos daría lo mismos resultados, haciendo una consulta mucho mas fácil de mantener. (Obviamente, lo primero sería optimizar el valor del IVA y que fuese una variable en vez de algo hardcoded, pero eso os lo dejo a vosotros)


Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.