Consultas
 SQL SERVER adaptadas al usuario
Muchas veces el administrador de Base de
datos  SQL Server recibe el encargo de
una consulta normal y corriente por  una
persona que no conoce el diseño interno de la base de datos. El administrador
realiza su consulta.
select Nombre_Campo, Nombre_Campo2, Nombre_Campo3 from propietario.Nombre_tabla where Nombre_Campo =  'Condición' 
Y
se encuentra con el resultado:
Copia el resultado en un Excel, se lo envía al
usuario (que suele ser el jefe) y se lleva una bronca monumental por hacer su
trabajo.
El problema es que el jefe no entiende que significa el 1 del campo 2 ni el 8 del campo 3 así que le pide que se lo traduzca. Un mal administrador buscaría la tabla asociada con los significados de cada número y lo traduciría a mano directamente en Excel.
Un buen administrador buscaría esas mismas tablas y las enlazaría en la SELECT con un INNER JOINT de este modo
SELECT        PROPIETARIO.Nombre_Tabla_Datos.intError, PROPIETARIO.Nombre_Tabla_Referencias.strDescripcion
FROM            PROPIETARIO.Nombre_Tabla_Referencias INNER
JOIN
                         PROPIETARIO.Nombre_Tabla_Datos ON
PROPIETARIO.Nombre_Tabla_Referencias = PROPIETARIO.Nombre_Tabla_Datos
Aquí
el resultado ya será comprensible por el usuario.
 Pero hay un caso aun peor. Es posible que la base
de datos no haya sido diseñada por nosotros y por tanto que no cumpla las
formas normales  y por
tanto podemos encontrarnos con valores de campos que no tienen la tabla de
traducción correspondiente. En este caso tampoco es necesario cambiar
manualmente el Excel para traducir los valores, se pueden traducir directamente
en la Consulta utilizando CASE WHEN  del
siguiente modo:
SELECT  PROPIETARIO.Nombre_Tabla.Nombre_Campo1,
                              
                                CASE WHEN PROPIETARIO.Nombre_Tabla.Campo_Estado
= 1
                                THEN 'CASO_1'
                                ELSE 'CASO_2'
                                END AS NOMBRE_COLUMNA,
                                PROPIETARIO.Nombre_Tabla.Nombre_Campo_N 
FROM   PROPIETARIO.Nombre_Tabla 
Si el campo tiene múltiples
opciones tenemos una versión un poco más compleja:
SELECT  PROPIETARIO.Nombre_Tabla.Nombre_Campo1, 
CASE 
                                 WHEN PROPIETARIO.Nombre_Tabla.Campo_Estado  = 1     THEN 'CASO_1'
                                 WHEN PROPIETARIO.Nombre_Tabla.Campo_Estado  = 2     THEN 'CASO_2'
                                ELSE 'CASO_3'
                                END AS NOMBRE_COLUMNA,
PROPIETARIO.Nombre_Tabla.Nombre_Campo_N 
FROM   PROPIETARIO.Nombre_Tabla
Este tipo de consultas no
se realizarán solamente si la base de datos está mal diseñada, hay múltiples
casos en los que es necesario traducir condiciones complejas, por ejemplo
pueden pedirnos que una columna muestre una S si una consulta diferente a la que estamos implementando cumple
unas condiciones determinadas y un a N si no las cumple. En general se pueden
complicar mucho los casos pero siempre siguiendo el mismo patrón, el código siguiente muestra el caso comentado.
SELECT  PROPIETARIO.Nombre_Tabla.Nombre_Campo1,
     CASE WHEN
          EXISTS
                (
                     SELECT *
                     FROM
                          PROPIETARIO.Nombre_Tabla2 
                     WHERE PROPIETARIO.Nombre_Tabla2.Nombre_Campo1 = 1   
                )
                    THEN 'S'
          ELSE 'N'
     END AS NOMBRE_CAMPO2,
PROPIETARIO.Nombre_Tabla.Nombre_Campo_N 
FROM   PROPIETARIO.Nombre_Tabla
En
este caso se ha insertado una subselect dentro las condiciones para mostrar el
campo.
O
también se pueden insertar otro tipo de funciones (por ejemplo las matemáticas)
 y combinar en ellos varios campos de
varias tablas. 
SELECT  PROPIETARIO.Nombre_Tabla.Nombre_Campo1,
                          
                               PROPIETARIO.Nombre_Tabla.Nombre_Campo2=SUM(ISNULL((-((CONVERT(DECIMAL,(SUBSTRING(PROPIETARIO.Nombre_Tabla.Nombre_Campo2,10,1))))*2 - 1)) * PROPIETARIO.Nombre_Tabla2.CampoN,0)), 
PROPIETARIO.Nombre_Tabla_Campo_N 
FROM   PROPIETARIO.Nombre_Tabla
Como podemos ver hay multitud
de posibilidades para insertar entre los campos de una consulta SELECT normal y
corriente y esto puede complicarla mucho desde el punto de vista de un primer
vistazo pero simplificar los resultados mostrados de cara al usuario final, si
tenemos en perspectiva la separación de cada campo la SELECT por muy compleja
que parezca no dejará de ser una consulta normal y corriente. 


muy buena explicacion muchas gracias fue de gran ayuda saludos,
ResponderEliminar