close
Breaking news

Todos los que tenemos alojamiento compartido hemos tenido a veces la necesidad d...read more

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)

Etiquetas: ,

No Comments

Leave a reply

Post your comment
Enter your name
Your e-mail address

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Story Page

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