Qué son las referencias cruzadas, cómo se construyen y para qué se utilizan.

Por Claudio
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

Una consulta de referencias cruzadas es aquella que nos permite visualizar los datos en filas y en columnas, estilo tabla, por ejemplo:

Producto / Año 1996 1997 Pantalones Camisas Zapatos 1.250 3.000 8.560 1.253 4.369 2.563

Si tenemos una tabla de productos y otra tabla de pedidos, podemos visualizar en total de productos pedidos por año para un artículo determinado, tal y como se visualiza en la tabla anterior. La sintaxis para este tipo de consulta es la siguiente:

TRANSFORM función agregada instrucción select PIVOT campo pivot [IN (valor1[, valor2[, ...]])]

En donde:

función agregada instrucción select campo pivot valor1, valor2 Son valores fijos utilizados para crear las cabeceras de la columna.

Es una función SQL agregada que opera sobre los datos seleccionados. Es una instrucción SELECT. Es el campo o expresión que desea utilizar para crear las cabeceras de la columna en el resultado de la consulta.

Para resumir datos utilizando una consulta de referencia cruzada, se seleccionan los valores de los campos o expresiones especificadas como cabeceras de columnas de tal forma que pueden verse los datos en un formato más compacto que con una consulta de selección. TRANSFORM es opcional pero si se incluye es la primera instrucción de una cadena SQL. Precede a la instrucción SELECT que especifica los campos utilizados como encabezados de fila y una

) TRANSFORM Sum(Cantidad) AS Ventas SELECT Compania FROM . Los meses aparecen de izquierda a derecha como columnas y los nombres de los productos aparecen de arriba hacia abajo como filas.cláusula GROUP BY que especifica el agrupamiento de las filas. al utilizar las cifras de ventas en el mes de la venta como pivot en una consulta de referencia cruzada se crearían 12 columnas. Opcionalmente puede incluir otras cláusulas como por ejemplo WHERE. valor2) listados en la cláusula opcional IN. Por ejemplo. Cantidad FROM Pedidos WHERE Fecha Between #01-01-1998# And #12-31-1998# GROUP BY Producto ORDER BY Producto PIVOT DatePart("m". para los que no existen datos. que especifica una selección adicional o un criterio de ordenación. Ejemplos TRANSFORM Sum(Cantidad) AS Ventas SELECT Producto. Fecha) (Crea una consulta de tabla de referencias cruzadas que muestra las ventas de productos por mes para un año específico. Puede restringir el campo pivot para crear encabezados a partir de los valores fijos (valor1. También puede incluir valores fijos. Los valores devueltos en campo pivot se utilizan como encabezados de columna en el resultado de la consulta. para crear columnas adicionales.

) Un caso práctico: Se trata de resolver el siguiente problema: tenemos una tabla de productos con dos campos. 'Trimestre 4') (Crea una consulta de tabla de referencias cruzadas que muestra las ventas de productos por trimestre de cada proveedor en el año indicado. 'Trimestre2'. la fecha del pedido y la cantidad pedida. Los trimestres aparecen de izquierda a derecha como columnas y los nombres de los proveedores aparecen de arriba hacia abajo como filas. tenemos otra tabla de pedidos en la que anotamos el código del producto. Estructura y datos de las tablas: Para resolver la consulta planteamos la siguiente consulta: . el código y el nombre del producto.Pedidos WHERE Fecha Between #01-01-1998# And #12-31-1998# GROUP BY Compania ORDER BY Compania PIVOT "Trimestre " & DatePart("q". calculando la media anual de ventas. 'Trimestre 3'. Fecha) In ('Trimestre1'. Deseamos consultar los totales de producto por año.

La primera tabla que debe figurar es aquella de donde deseamos extraer los datos. esta tabla debe contener al menos tres campos.Cantidad) AS TOTAL.Cantidad) AS Media FROM Pedidos. indicando el nombre del campo que deseamos mostrar en cada columna o el valor de la misma. uno para los títulos de la fila. puesto que las demás columnas son opcionales. . Artículos WHERE Pedidos. otros para los títulos de la columna y otro para calcular el valor de las celdas.Id = Artículos.TRANSFORM Sum(Pedidos.Id. en este caso 1996 y 1997.Cantidad) AS Resultado SELECT Nombre AS Producto.Id AS Código. Total y Media.Id GROUP BY Pedidos.75 375 620 1320 Comentarios a la consulta: La cláusula TRANSFORM indica el valor que deseamos visualizar en las columnas que realmente pertenecen a la consulta. Si incluimos una función de cálculo el resultado se hará basándose en los datos de la fila actual y no al total de los datos. en este caso Producto. Artículos. Avg(Pedidos. Pedidos.Nombre PIVOT Year(Fecha) Y obtenemos el siguiente resultado: Producto Código Total Media 1996 1997 Zapatos Pantalones Blusas 1 2 3 348 1940 87 485 300 48 580 955 238. SELECT especifica el nombre de las columnas opcionales que deseamos visualizar. Sum(Pedidos. Código. FROM especifica el origen de los datos.

2. Para agrupamiento por meses (sin tener en cuenta el año) PIVOT Format([Fecha]. "Mar".[Fecha]). Para agrupamiento por Trimestres: PIVOT "Tri " & DatePart("q".En este caso en concreto se deseaba visualizar el nombre del producto. Otras posibilidades de fecha de la cláusula pivot son las siguientes: 1.cantidad y artículos. "Dic"). "Abr". "Jun". 3. por ello agrupamos por los campos. La cláusula GROUP BY especifica el agrupamiento de los registros. como en la tabla de pedidos sólo figuraba el código del mismo se añadió una nueva columna en la cláusula select llamada Producto que se corresponda con el campo Nombre de la tabla de artículos.nombre. . "Nov". "May". "Sep". "Feb"."Short Date")."mmm") In ("Ene". En este caso existen dos campos de los que extraemos la información: pedidos. "Oct". "Jul". Para agrupar por días PIVOT Format([Fecha]. Para finalizar la cláusula PIVOT indica el nombre de las columnas no opcionales. extrayéndolo del campo pedidos. en este caso 1996 y 1997 y como vamos a el dato que aparecerá en las columnas. Para vincular el código del artículo de la tabla de pedidos con el nombre del mismo de la tabla artículos se insertó la cláusula INNER JOIN.fecha. en este caso empleamos el año en que se produjo el pedido. "Ago". contrariamente a los manuales de instrucción esta cláusula no es opcional ya que debe figurar siempre y debemos agrupar los registros por el campo del cual extraemos la información.

debe actualizar a SQL Server 2005 o SQL Server 2008 (recomendado). TSQL Laboratorio 15 Otro Ejemplo de consulta PIVOT TSQL Laboratorio 16 .SQL SERVER . Operador PIVOT sólo está disponible en SQL Server 2005/2008. SQL Server 2005 introdujo dos nuevos operadores: PIVOT y UNPIVOT que hizo por escrito la ficha consultas entre más fácil. La operación inversa de PIVOT es UNPIVOT.com ) UNPIVOT Tabla tabla dinámica Compartir: • • • • • • • • • • .Ejemplo de consulta PIVOT Tab UNPIVOT Cruz en diferentes versiones de SQL Server 01 de octubre 2008 por el pinaldave La transformación de las filas en las columnas (PIVOT / CRUZ TAB) y las columnas a las filas (UNPIVOT) puede ser uno de los requisitos comunes que todos nosotros debemos haber visto varias veces en nuestra vida de programación.Ejemplo UNPIVOT Tabla Referencia: Pinal Dave ( http://blog.La generación de resultados entre distintas tabs en SQL Server 2000 TSQL Laboratorio 17 . Mi amigo y SQL Server MVP Jacob Sebastian ha publicado un ejemplo que transformar filas de columnas con operador PIVOT. No existe en SQL Server 2000. SQL SERVER Ejemplos PIVOT y SQL SERVER Ejemplo de SQL SERVER .SQLAuthority.Un ejemplo del uso UNPIVOT (Transformación de las columnas en filas) Artículos escritos por mí anteriormente. Si bien la discusión de este tema con Jacob otro día escribió los mensajes después de tan rápido que era muy impresionante. Los desarrolladores que siguen utilizando SQL Server 2000.

consultas SQL . Tax1. SQL . TAX2. PIVOT . itemvalue. party3. si cualquier solución por favor dígame. itemamount. Publicado en Pinal de Dave . UNPIVOT | 12 Comentarios 12 Respuestas 1. SQL Consejos y trucos . SQL Server . así como de resultados se espera que le ayude . el 24 de septiembre 2010 a las 6:41 pm | Responder Dinesh mi problema es el siguiente: 1 mesa de la tienda idno. Tecnología | Etiquetado MVP . Fui a ver como esta Parte1 PARTIDO2 party3 ItemName 200 210 220 Tax1 10 11 12 TAX2 1 3 4 pero trato de no hacerlo liks esto. ItemName. Parte1. PARTIDO2. SQL Autoridad . SQL T .• • De esta manera: Como Sé el primero en gusto de este poste. otra mesa de la tienda idno. Dinesh o el 24 de septiembre 2010 a las 8:49 pm | Responder Madhivanan Es necesario publicar algunos datos.

o el 23 de septiembre 2011 a las 2:11 pm | Responder Uttekar Amit Tengo este tipo de datos: Aquí Fecha de Investigación es combo-box. donde se puede seleccionar la fecha: -----------------------------Investigación Fecha 21/09/2011 -----------------------------Resultados de prueba Nombre Unidad Rango Comentarios -----------------------------Prueba de sangre 1.Net acceso de codificación directa. ================================================== ====== *** Ahora quiero los datos de este tipo *** -----------------------------Prueba Nombre 21/09/2011 25/09/2011 -----------------------------Prueba de sangre 1.5 -----------------------------Véase más arriba Análisis de sangre 2 se insertan.0 mg . ================================================== ====== Acceso de consulta: TRANSFORMAR En primer lugar (dtInvestigation.5 mg 2.5 Prueba en orina 7. Mientras la primera prueba se realiza en 21/09/2011 y 25/09/2011 en la segunda. InvDate) como el soldado.0 mg mg 1. que se ejecuta correctamente.5 mg mg 1. Si bien había utilice esta consulta en VB.InvValue & '' & InvUnit) COMO mstInvestigation.InvDate Cuando no es nulo y Patid = 1 GROUP BY mstInvestigation.0-15.InvstId dtInvestigation.0-2.InvstName PIVOT (dtInvestigation .InvstName FirstOfInvId SELECT dtInvestigation INNER JOIN mstInvestigation EN dtInvestigation. Y prueba de orina que se hace en el 25/09/2011.InvId = mstInvestigation.5mg/dl mg / dl 4.5 Prueba de sangre 2.0-2.

00 3.. es decir. Date_of_birth fecha y hora. Amit Uttekar [Correo electrónico eliminado] 2. por favor me ayude en esto pronto . que sea rápido y me envían la respuesta a la brevedad posible Usted me puede responder aquí: .Prueba en orina 7.00 y etc ...00...5mg/dl -----------------------------Por favor... en el que una columna llamada cantidad existe ... la cantidad de selección del datamart me muestra un conjunto de datos como .. el 01 de octubre 2010 a las 11:01 am | Responder Amisha parekh Tengo una tabla llamada datamart .. Apellido varchar (50). . tales como 2. Cuando selecciono una consulta de datos a través .00 3. Medical_record_number varchar (20). tiene una cantidad de datos...00 y así sucesivamente ..[correo electrónico eliminado] Un cordial saludo. pero quiero tener una base de datos en el siguiente formato .00 y así sucesivamente . cantidad 2. el 23 de noviembre 2010 a las 9:39 am | Responder Richie Lawren Problema de SQL Supongamos que hemos cargado un archivo plano con los datos de diagnóstico del paciente en una tabla llamada "Datos". cantidad 2. La estructura de la tabla es la siguiente: Crear datos de tabla ( Apellido varchar (50).. Amisha 3.3..

'1 / 3/2009'. 'asma' 'Tom'. debe ser capaz de encontrar uno que utiliza una sola consulta. Diagnosis_code varchar (20)) Los datos del archivo plano se parece a esto: 'Jane'. sin subconsultas. '1 / 3/2009'. '4 / 12/2002 '.' NRM-11111 '. '3 / 3/2009'. ¿QUÉ PUEDO HACER? . 'Thomas'. 4. 'Jones'.Diagnosis_date fecha y hora. '4 / 12/2002 '. 'asma' 'Jack'. El problema es el siguiente: Tom Smith tiene 2 números diferentes de historias clínicas. '4 / 12/2002 '. '2 2 / / 2001 '. '3 7 / / 2009'.' NRM-22222 '. 'la diabetes' 'Tom'. 'la diabetes' 'Jane'. 'asma' 'Jane'. 'Smith'. 'asma' Se puede asumir que no hay dos pacientes tienen el primer nombre mismo apellido. '3 / 3/2009'. Este problema tiene muchas soluciones. 'Smith'.' NRM-11111 '. la 'gripe' 'Tom'. pero si usted sabe de SQL. '5 / 5/1975 '. '2 / 7/2009'. el 31 de marzo 2011 a las 3:19 pm | Responder Manjunatha Estoy amable Requeistng por favor a ti te cómo me pueden insertar diferentes campos en diferentes tablas de una forma 5.' NRM-44444 '. '8 10 / / 1991 '. 'Jones'. '2 17 / / 2009'. 'Jones'. y fecha de la combinación de nacimiento. el 13 de septiembre 2011 a las 3:45 pm | Responder Dhanashree QUIERO para mostrar el informe en nombre de la misma columna (repetición) y los campos de diffrent son de pantalla en la columna diffrent mediante el uso de pivote.' NRM-88888 '. 'Smith'. '2 2 / / 2001 '. Escriba una consulta que siempre se muestran todos los pacientes que son como Tom Smith en los pacientes con más de un número de historia clínica.' NRM-33333 '.' NRM-33333 '.

CONVERT (VARCHAR.NUM_QUANTITY) + T.BIT_DELETED_FLAG m.VCH_UNIT + AS cantidad. el 13 de enero 2012 a las 9:20 pm | Responder Malcolm Hola y gracias por toda la gran información! Tengo un escenario que necesito ayuda y espero que usted me puede ayudar.VCH_UNIT.INT_MP_ID Y M. . 106) AS DE DTM_PLAN_APPROVAL M_MIS_MININGPLAN_ML M.BIT_DELETED_FLAG = 0 Y = 0 y T.DTM_PLAN_APPROVAL.INT_CIRCLE_ID = 7 y T..INT_MP_ID = T. M.NUM_QUANTITY) T. Tengo una tabla que tiene este aspecto. el 28 de diciembre 2011 a las 24:58 | Responder Madhu select * from (SELECT DISTINCT (T. DTM_PLAN_APPROVAL) GetTable PIVOT (Max (DTM_PLAN_APPROVAL) POR CANTIDAD EN (¿Puedo escribir la declaración theselect aquí.VCH_YEAR). T. el 28 de diciembre 2011 a las 24:56 | Responder Madhu ¿dónde está la solución de los querys anteriores . EMP NOMBRE | NOMBRE STAT | STAT | SEMANA "JACK" | "número de visitas" | 12 | 1 "JACK" | "número de visitas" | 22 | 2 "Susan" | "Número de llamadas manejadas" | 125 | 1 "Susan" | "Número de llamadas manejadas" | 105 | 2 Mi problema es que tengo que devolver una sola fila para cada uno "Nombre de estadísticas" por cada empleado para que mi conjunto de datos se vería así. CONVERT (VARCHAR. CONVERT (VARCHAR.6.INT_LESSEE_ID GROUP BY VCH_YEAR. T T_MIS_MININGPLAN_ML DONDE M.)) AS RIII 8. 7.INT_MINERAL_ID = 13 Y = 271 M. T.

ALLOW_ROW_LOCKS = ON. [AgentID] [int] NOT NULL. Mu \ y Id es: [correo electrónico eliminado] . el 27 de enero 2012 a las 7:56 pm | Responder Bhavik Tengo una consulta a Quiero Dispaly salida Ponga como como AgentID | Lun | Mar | Mie | jue | vie | SAT | dom. [StartTime] [varchar] (50) NULL.EMP NOMBRE | NOMBRE STAT | Semana 1 | PARTE 2 "JACK" | "número de visitas" | 12 | 22 "Susan" | "Número de llamadas manejadas" | 125 | 105 Estoy un poco perdido en lo que lo que hay que hacer es conseguir que este tipo de resultado. 1 17:00 17:00 17:00 17:00 17:00 17:00 17:00 ====================================== Mi tabla de este modo CREATE TABLE [dbo]. [WeekID] [int] NULL. [CRMScheduleMaster] ( [Scheduled] NO [int] IDENTIDAD (1. STATISTICS_NORECOMPUTE = OFF. ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] ================ Así que por favor dar la solución. CONSTRAINT [PK_ScheduleMaster] PRIMARY KEY CLUSTERED ( [Scheduled] ASC ) CON (PAD_INDEX = OFF. ¿Alguna sugerencia? Gracias por adelantado! 9. IGNORE_DUP_KEY = OFF.1) NULL. [EndTime] [varchar] (50) NULL.

00 2803 1 27/01/2012 10. sno rhr_s Fecha Hora 1 26/01/2012 07.00 2804 . aquí está la scnerio..00 2804 tb1 datatype autogeneración sno.00 2801 1 26/01/2012 08.00 2802 3 26/01/2012 09. fecha varchar (16).10. el 05 de marzo 2012 a las 3:46 pm | Responder Mahajan Sudhanshu i reallly quiere su ayuda en una consulta haciendo el tabulación cruzada . plzzz me ayude . fecha varchar (16).00 2801 2 26/01/2012 08.. int rhr_s1.. rhrs int. el tiempo varchar (10)...00 2803 4 26/01/2012 10. el tiempo varchar (10).00 2802 1 27/01/2012 09. hay muchas mesas. tuberculosis datatype autogeneración sno. sno rhr_s Fecha Hora 1 26/01/2012 07.

00 2814 quiero una ficha crross de esta manera en el formato de fecha al azar sin fecha fija ** Cols -----26/01/2012----------27/01/2012 -----.00 2811 2 26/01/2012 08.00 2813 4 27/01/2012 10.00 2813 8 28/01/2012 10.00 2811 6 27/01/2012 08.00 2814 TB2 datatype autogeneración sno.5 27/01/2012 07. int rhr_s2. el tiempo varchar (10).28/01/2012 ** \ \ \ \ rhr_s-(máximos y mínimos en la fecha = 26/01/2012) (máximos y mínimos que date = 27/01/2012) (misma fórmula) \ \ \ \ rhr_s1 como anteriormente como anteriormente como anteriormente \ .00 2812 7 28/01/2012 09.00 2812 3 27/01/2012 09. fecha varchar (16). sno de fecha y hora rhr_s2 1 26/01/2012 07.

\ \ \ rhr_s2 como anteriormente como anteriormente como anteriormente por favor me ayude en la toma de este tipo de informe .. i i reallly problemas ....

Sign up to vote on this title
UsefulNot useful