referencias cruzadas

En SQL-Server no hay consultas de referencias cruzadas, para eso está OLAP. 

La puedes disimular con consultas agrupadas. Te pego un texto sacado de la ayuda: 

------------------- 
Informes de tablas de referencias cruzadas 

Algunas veces es necesario hacer girar los resultados, de forma que las columnas se presenten horizontalmente y las filas se presenten verticalmente. Esto se conoce como crear PivotTable®, crear un informe de tabla de referencia cruzada o girar datos. 

Suponga que hay una tabla Pivot que tiene una fila por trimestre. Un SELECT de Pivot informa de los trimestres verticalmente: 

Year Quarter Amount 
---- ------- ------ 
1990 1 1.1 
1990 2 1.2 
1990 3 1.3 
1990 4 1.4 
1991 1 2.1 
1991 2 2.2 
1991 3 2.3 
1991 4 2.4 

Debe crearse un informe con una tabla que contenga una fila por cada año, con los valores de cada trimestre en una columna separada, como en: 

Year Q1 Q2 Q3 Q4 

1990 1.1 1.2 1.3 1.4 

1991 2.1 2.2 2.3 2.4 



Éstas son las instrucciones que se utilizan para crear la tabla Pivot y rellenarla con los datos de la primera tabla: 

USE Northwind 
GO 

CREATE TABLE Pivot 
( Year SMALLINT, 
Quarter TINYINT, 
Amount DECIMAL(2,1) ) 
GO 
INSERT INTO Pivot VALUES (1990, 1, 1.1) 
INSERT INTO Pivot VALUES (1990, 2, 1.2) 
INSERT INTO Pivot VALUES (1990, 3, 1.3) 
INSERT INTO Pivot VALUES (1990, 4, 1.4) 
INSERT INTO Pivot VALUES (1991, 1, 2.1) 
INSERT INTO Pivot VALUES (1991, 2, 2.2) 
INSERT INTO Pivot VALUES (1991, 3, 2.3) 
INSERT INTO Pivot VALUES (1991, 4, 2.4) 
GO 

Ésta es la instrucción SELECT que se utiliza para crear resultados girados: 

SELECT Year, 
SUM(CASE Quarter WHEN 1 THEN Amount ELSE 0 END) AS Q1, 
SUM(CASE Quarter WHEN 2 THEN Amount ELSE 0 END) AS Q2, 
SUM(CASE Quarter WHEN 3 THEN Amount ELSE 0 END) AS Q3, 
SUM(CASE Quarter WHEN 4 THEN Amount ELSE 0 END) AS Q4 
FROM Northwind.dbo.Pivot 
GROUP BY Year 
GO 

Esta instrucción SELECT realiza también el tratamiento de una tabla en la que hay varias filas por cada trimestre. La cláusula GROUP BY combina todas las filas de Pivot de un año determinado en una única fila del resultado. Cuando se realiza la operación de agrupamiento, las funciones CASE de los agregados SUM se aplican de tal forma que los valores Amount de cada trimestre se agregan a la columna adecuada del conjunto de resultados, y se agrega 0 a las columnas del conjunto de resultados del resto de los trimestres. 

Si los resultados de esta instrucción SELECT se usan como entrada de una hoja de cálculo, es fácil para la hoja de cálculo calcular un total para cada año. Cuando se usa SELECT desde una aplicación, puede ser más fácil mejorar la instrucción SELECT para calcular el total anual. Por ejemplo: 

SELECT P1.*, (P1.Q1 + P1.Q2 + P1.Q3 + P1.Q4) AS YearTotal 
FROM (SELECT Year, 
SUM(CASE P.Quarter WHEN 1 THEN P.Amount ELSE 0 END) AS Q1, 
SUM(CASE P.Quarter WHEN 2 THEN P.Amount ELSE 0 END) AS Q2, 
SUM(CASE P.Quarter WHEN 3 THEN P.Amount ELSE 0 END) AS Q3, 
SUM(CASE P.Quarter WHEN 4 THEN P.Amount ELSE 0 END) AS Q4 
FROM Pivot AS P 
GROUP BY P.Year) AS P1 
GO 

GROUP BY con CUBE y GROUP BY con ROLLUP calculan la misma clase de información, como se muestra en el ejemplo, pero con un formato un poco diferente.

Entradas populares de este blog