You are on page 1of 15

Qu son las referencias cruzadas, cmo se construyen y para qu se utilizan.

Por Claudio
Atencin: 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 / Ao 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 ao para un artculo determinado, tal y como se visualiza en la tabla anterior. La sintaxis para este tipo de consulta es la siguiente:

TRANSFORM funcin agregada instruccin select PIVOT campo pivot [IN (valor1[, valor2[, ...]])]

En donde:

funcin agregada instruccin select campo pivot valor1, valor2 Son valores fijos utilizados para crear las cabeceras de la columna.

Es una funcin SQL agregada que opera sobre los datos seleccionados. Es una instruccin SELECT. Es el campo o expresin 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 ms compacto que con una consulta de seleccin. TRANSFORM es opcional pero si se incluye es la primera instruccin de una cadena SQL. Precede a la instruccin SELECT que especifica los campos utilizados como encabezados de fila y una

clusula GROUP BY que especifica el agrupamiento de las filas. Opcionalmente puede incluir otras clusulas como por ejemplo WHERE, que especifica una seleccin adicional o un criterio de ordenacin. Los valores devueltos en campo pivot se utilizan como encabezados de columna en el resultado de la consulta. Por ejemplo, al utilizar las cifras de ventas en el mes de la venta como pivot en una consulta de referencia cruzada se crearan 12 columnas. Puede restringir el campo pivot para crear encabezados a partir de los valores fijos (valor1, valor2) listados en la clusula opcional IN. Tambin puede incluir valores fijos, para los que no existen datos, para crear columnas adicionales. Ejemplos

TRANSFORM Sum(Cantidad) AS Ventas SELECT Producto, Cantidad FROM Pedidos WHERE Fecha Between #01-01-1998# And #12-31-1998# GROUP BY Producto ORDER BY Producto PIVOT DatePart("m", Fecha) (Crea una consulta de tabla de referencias cruzadas que muestra las ventas de productos por mes para un ao especfico. Los meses aparecen de izquierda a derecha como columnas y los nombres de los productos aparecen de arriba hacia abajo como filas.)

TRANSFORM Sum(Cantidad) AS Ventas SELECT Compania FROM

Pedidos WHERE Fecha Between #01-01-1998# And #12-31-1998# GROUP BY Compania ORDER BY Compania PIVOT "Trimestre " & DatePart("q", Fecha) In ('Trimestre1', 'Trimestre2', 'Trimestre 3', 'Trimestre 4') (Crea una consulta de tabla de referencias cruzadas que muestra las ventas de productos por trimestre de cada proveedor en el ao indicado. Los trimestres aparecen de izquierda a derecha como columnas y los nombres de los proveedores aparecen de arriba hacia abajo como filas.)

Un caso prctico: Se trata de resolver el siguiente problema: tenemos una tabla de productos con dos campos, el cdigo y el nombre del producto, tenemos otra tabla de pedidos en la que anotamos el cdigo del producto, la fecha del pedido y la cantidad pedida. Deseamos consultar los totales de producto por ao, calculando la media anual de ventas. Estructura y datos de las tablas:

Para resolver la consulta planteamos la siguiente consulta:

TRANSFORM Sum(Pedidos.Cantidad) AS Resultado SELECT Nombre AS Producto, Pedidos.Id AS Cdigo, Sum(Pedidos.Cantidad) AS TOTAL, Avg(Pedidos.Cantidad) AS Media FROM Pedidos, Artculos WHERE Pedidos.Id = Artculos.Id GROUP BY Pedidos.Id, Artculos.Nombre PIVOT Year(Fecha)

Y obtenemos el siguiente resultado:

Producto Cdigo Total Media 1996 1997 Zapatos Pantalones Blusas 1 2 3 348 1940 87 485 300 48 580 955 238,75 375

620 1320

Comentarios a la consulta: La clusula TRANSFORM indica el valor que deseamos visualizar en las columnas que realmente pertenecen a la consulta, en este caso 1996 y 1997, puesto que las dems columnas son opcionales. SELECT especifica el nombre de las columnas opcionales que deseamos visualizar, en este caso Producto, Cdigo, Total y Media, indicando el nombre del campo que deseamos mostrar en cada columna o el valor de la misma. Si incluimos una funcin de clculo el resultado se har basndose en los datos de la fila actual y no al total de los datos. FROM especifica el origen de los datos. La primera tabla que debe figurar es aquella de donde deseamos extraer los datos, esta tabla debe contener al menos tres campos, uno para los ttulos de la fila, otros para los ttulos de la columna y otro para calcular el valor de las celdas.

En este caso en concreto se deseaba visualizar el nombre del producto, como en la tabla de pedidos slo figuraba el cdigo del mismo se aadi una nueva columna en la clusula select llamada Producto que se corresponda con el campo Nombre de la tabla de artculos. Para vincular el cdigo del artculo de la tabla de pedidos con el nombre del mismo de la tabla artculos se insert la clusula INNER JOIN. La clusula GROUP BY especifica el agrupamiento de los registros, contrariamente a los manuales de instruccin esta clusula no es opcional ya que debe figurar siempre y debemos agrupar los registros por el campo del cual extraemos la informacin. En este caso existen dos campos de los que extraemos la informacin: pedidos.cantidad y artculos.nombre, por ello agrupamos por los campos. Para finalizar la clusula PIVOT indica el nombre de las columnas no opcionales, en este caso 1996 y 1997 y como vamos a el dato que aparecer en las columnas, en este caso empleamos el ao en que se produjo el pedido, extrayndolo del campo pedidos.fecha. Otras posibilidades de fecha de la clusula pivot son las siguientes: 1. Para agrupamiento por Trimestres: PIVOT "Tri " & DatePart("q",[Fecha]); 2. Para agrupamiento por meses (sin tener en cuenta el ao) PIVOT Format([Fecha],"mmm") In ("Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"); 3. Para agrupar por das PIVOT Format([Fecha],"Short Date");

SQL SERVER - Ejemplo de consulta PIVOT Tab UNPIVOT Cruz en diferentes versiones de SQL Server
01 de octubre 2008 por el pinaldave La transformacin 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 programacin. SQL Server 2005 introdujo dos nuevos operadores: PIVOT y UNPIVOT que hizo por escrito la ficha consultas entre ms fcil. Mi amigo y SQL Server MVP Jacob Sebastian ha publicado un ejemplo que transformar filas de columnas con operador PIVOT. La operacin inversa de PIVOT es UNPIVOT. Operador PIVOT slo est disponible en SQL Server 2005/2008. No existe en SQL Server 2000. Los desarrolladores que siguen utilizando SQL Server 2000, debe actualizar a SQL Server 2005 o SQL Server 2008 (recomendado). Si bien la discusin de este tema con Jacob otro da escribi los mensajes despus de tan rpido que era muy impresionante. TSQL Laboratorio 15 Otro Ejemplo de consulta PIVOT TSQL Laboratorio 16 - La generacin de resultados entre distintas tabs en SQL Server 2000 TSQL Laboratorio 17 - Un ejemplo del uso UNPIVOT (Transformacin de las columnas en filas) Artculos escritos por m anteriormente. SQL SERVER Ejemplos PIVOT y SQL SERVER Ejemplo de SQL SERVER - Ejemplo UNPIVOT Tabla Referencia: Pinal Dave ( http://blog.SQLAuthority.com ) UNPIVOT Tabla tabla dinmica

Compartir:

De esta manera:
Como S el primero en gusto de este poste.

Publicado en Pinal de Dave , SQL , SQL Autoridad , consultas SQL , SQL Server , SQL Consejos y trucos , SQL T , Tecnologa | Etiquetado MVP , PIVOT , UNPIVOT | 12 Comentarios

12 Respuestas

1.

el 24 de septiembre 2010 a las 6:41 pm | Responder

Dinesh

mi problema es el siguiente: 1 mesa de la tienda idno, ItemName, itemvalue, itemamount. otra mesa de la tienda idno, Tax1, TAX2, Parte1, PARTIDO2, party3, 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. si cualquier solucin por favor dgame. Dinesh

el 24 de septiembre 2010 a las 8:49 pm | Responder Madhivanan

Es necesario publicar algunos datos, as como de resultados se espera que le ayude

el 23 de septiembre 2011 a las 2:11 pm | Responder Uttekar

Amit

Tengo este tipo de datos: Aqu Fecha de Investigacin es combo-box, donde se puede seleccionar la fecha: -----------------------------Investigacin Fecha 21/09/2011 -----------------------------Resultados de prueba Nombre Unidad Rango Comentarios -----------------------------Prueba de sangre 1,5 mg mg 1.0-2.5 Prueba de sangre 2,0 mg mg 1.0-2.5 Prueba en orina 7.5mg/dl mg / dl 4,0-15,5 -----------------------------Vase ms arriba Anlisis de sangre 2 se insertan, Mientras la primera prueba se realiza en 21/09/2011 y 25/09/2011 en la segunda. Y prueba de orina que se hace en el 25/09/2011. Si bien haba utilice esta consulta en VB.Net acceso de codificacin directa, que se ejecuta correctamente. ================================================== ====== Acceso de consulta: TRANSFORMAR En primer lugar (dtInvestigation.InvValue & '' & InvUnit) COMO mstInvestigation.InvstName FirstOfInvId SELECT dtInvestigation INNER JOIN mstInvestigation EN dtInvestigation.InvId = mstInvestigation.InvstId dtInvestigation.InvDate Cuando no es nulo y Patid = 1 GROUP BY mstInvestigation.InvstName PIVOT (dtInvestigation . InvDate) como el soldado; ================================================== ====== *** Ahora quiero los datos de este tipo *** -----------------------------Prueba Nombre 21/09/2011 25/09/2011 -----------------------------Prueba de sangre 1,5 mg 2,0 mg

Prueba en orina 7.5mg/dl -----------------------------Por favor, que sea rpido y me envan la respuesta a la brevedad posible Usted me puede responder aqu: - [correo electrnico eliminado] Un cordial saludo, Amit Uttekar [Correo electrnico eliminado]

2.

el 01 de octubre 2010 a las 11:01 am | Responder

Amisha parekh

Tengo una tabla llamada datamart ... en el que una columna llamada cantidad existe ... tiene una cantidad de datos, tales como 2.00,3.00 y etc ... Cuando selecciono una consulta de datos a travs ... es decir, la cantidad de seleccin del datamart me muestra un conjunto de datos como ... cantidad 2,00 3,00 y as sucesivamente .. pero quiero tener una base de datos en el siguiente formato ... cantidad 2,00 3,00 y as sucesivamente .. por favor me ayude en esto pronto ... Amisha

3.

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 diagnstico del paciente en una tabla llamada "Datos". La estructura de la tabla es la siguiente: Crear datos de tabla ( Apellido varchar (50), Apellido varchar (50), Date_of_birth fecha y hora, Medical_record_number varchar (20),

Diagnosis_date fecha y hora, Diagnosis_code varchar (20)) Los datos del archivo plano se parece a esto: 'Jane', 'Jones', '2 2 / / 2001 ',' NRM-11111 ', '3 / 3/2009', 'la diabetes' 'Jane', 'Jones', '2 2 / / 2001 ',' NRM-11111 ', '1 / 3/2009', 'asma' 'Jane', 'Jones', '5 / 5/1975 ',' NRM-88888 ', '2 17 / / 2009', la 'gripe' 'Tom', 'Smith', '4 / 12/2002 ',' NRM-22222 ', '3 / 3/2009', 'la diabetes' 'Tom', 'Smith', '4 / 12/2002 ',' NRM-33333 ', '1 / 3/2009', 'asma' 'Tom', 'Smith', '4 / 12/2002 ',' NRM-33333 ', '2 / 7/2009', 'asma' 'Jack', 'Thomas', '8 10 / / 1991 ',' NRM-44444 ', '3 7 / / 2009', 'asma' Se puede asumir que no hay dos pacientes tienen el primer nombre mismo apellido, y fecha de la combinacin de nacimiento. El problema es el siguiente: Tom Smith tiene 2 nmeros diferentes de historias clnicas. Escriba una consulta que siempre se muestran todos los pacientes que son como Tom Smith en los pacientes con ms de un nmero de historia clnica. Este problema tiene muchas soluciones, pero si usted sabe de SQL, debe ser capaz de encontrar uno que utiliza una sola consulta, sin subconsultas.

4.

el 31 de marzo 2011 a las 3:19 pm | Responder

Manjunatha

Estoy amable Requeistng por favor a ti te cmo me pueden insertar diferentes campos en diferentes tablas de una forma

5.

el 13 de septiembre 2011 a las 3:45 pm | Responder

Dhanashree

QUIERO para mostrar el informe en nombre de la misma columna (repeticin) y los campos de diffrent son de pantalla en la columna diffrent mediante el uso de pivote. QU PUEDO HACER?

6.

el 28 de diciembre 2011 a las 24:56 | Responder

Madhu

dnde est la solucin de los querys anteriores ..

7.

el 28 de diciembre 2011 a las 24:58 | Responder

Madhu

select * from (SELECT DISTINCT (T.VCH_YEAR), CONVERT (VARCHAR, T.NUM_QUANTITY) T.VCH_UNIT + AS cantidad, CONVERT (VARCHAR, M.DTM_PLAN_APPROVAL, 106) AS DE DTM_PLAN_APPROVAL M_MIS_MININGPLAN_ML M, T T_MIS_MININGPLAN_ML DONDE M.INT_MP_ID = T.INT_MP_ID Y M.BIT_DELETED_FLAG = 0 Y = 0 y T.BIT_DELETED_FLAG m.INT_CIRCLE_ID = 7 y T.INT_MINERAL_ID = 13 Y = 271 M.INT_LESSEE_ID GROUP BY VCH_YEAR, CONVERT (VARCHAR, T.NUM_QUANTITY) + T.VCH_UNIT, DTM_PLAN_APPROVAL) GetTable PIVOT (Max (DTM_PLAN_APPROVAL) POR CANTIDAD EN (Puedo escribir la declaracin theselect aqu.)) AS RIII

8.

el 13 de enero 2012 a las 9:20 pm | Responder

Malcolm

Hola y gracias por toda la gran informacin! Tengo un escenario que necesito ayuda y espero que usted me puede ayudar. Tengo una tabla que tiene este aspecto; EMP NOMBRE | NOMBRE STAT | STAT | SEMANA "JACK" | "nmero de visitas" | 12 | 1 "JACK" | "nmero de visitas" | 22 | 2 "Susan" | "Nmero de llamadas manejadas" | 125 | 1 "Susan" | "Nmero de llamadas manejadas" | 105 | 2 Mi problema es que tengo que devolver una sola fila para cada uno "Nombre de estadsticas" por cada empleado para que mi conjunto de datos se vera as;

EMP NOMBRE | NOMBRE STAT | Semana 1 | PARTE 2 "JACK" | "nmero de visitas" | 12 | 22 "Susan" | "Nmero de llamadas manejadas" | 125 | 105 Estoy un poco perdido en lo que lo que hay que hacer es conseguir que este tipo de resultado. Alguna sugerencia? Gracias por adelantado!

9.

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. 1 17:00 17:00 17:00 17:00 17:00 17:00 17:00 ====================================== Mi tabla de este modo CREATE TABLE [dbo]. [CRMScheduleMaster] ( [Scheduled] NO [int] IDENTIDAD (1,1) NULL, [AgentID] [int] NOT NULL, [WeekID] [int] NULL, [StartTime] [varchar] (50) NULL, [EndTime] [varchar] (50) NULL, CONSTRAINT [PK_ScheduleMaster] PRIMARY KEY CLUSTERED ( [Scheduled] ASC ) CON (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] ================ As que por favor dar la solucin. Mu \ y Id es: [correo electrnico eliminado]

10. el 05 de marzo 2012 a las 3:46 pm | Responder Mahajan

Sudhanshu

i reallly quiere su ayuda en una consulta haciendo el tabulacin cruzada ... aqu est la scnerio. plzzz me ayude .... hay muchas mesas. tuberculosis datatype autogeneracin sno, fecha varchar (16), el tiempo varchar (10), rhrs int, sno rhr_s Fecha Hora 1 26/01/2012 07,00 2801 1 26/01/2012 08,00 2802 1 27/01/2012 09,00 2803 1 27/01/2012 10,00 2804 tb1 datatype autogeneracin sno, fecha varchar (16), el tiempo varchar (10), int rhr_s1, sno rhr_s Fecha Hora 1 26/01/2012 07,00 2801 2 26/01/2012 08,00 2802 3 26/01/2012 09,00 2803 4 26/01/2012 10,00 2804

5 27/01/2012 07,00 2811 6 27/01/2012 08,00 2812 7 28/01/2012 09,00 2813 8 28/01/2012 10,00 2814 TB2 datatype autogeneracin sno, fecha varchar (16), el tiempo varchar (10), int rhr_s2, sno de fecha y hora rhr_s2 1 26/01/2012 07,00 2811 2 26/01/2012 08,00 2812 3 27/01/2012 09,00 2813 4 27/01/2012 10,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 ------ 28/01/2012 ** \ \ \ \ rhr_s-(mximos y mnimos en la fecha = 26/01/2012) (mximos y mnimos que date = 27/01/2012) (misma frmula) \ \ \ \ rhr_s1 como anteriormente como anteriormente como anteriormente \

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

You might also like