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.

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies. ACEPTAR

Aviso de cookies