1. DAI - Ing. Arturo Rozas Huacho 1
4.1.7.- Tablas Cruzadas
Sistemas de Base de Datos
Para entender el concepto de
tablas cruzadas, veamos el
siguiente ejemplo:
Supongamos que se desea
Analizar las ventas por tipo de
prenda y color.
En un proceso previo se obtuvo
la siguiente tabla.
Prenda Color Cantidad
Camisa Blanco 5
Camisa Oscuro 13
Camisa Pastel 12
Chompa Blanco 6
Chompa Claro 9
Chompa Oscuro 11
Chompa Pastel 2
Pantalon Claro 1
Pantalon Oscuro 21
Pantalon Pastel 7
Polo Blanco 3
Polo Claro 8
Polo Oscuro 1
CrossTable1
2. DAI - Ing. Arturo Rozas Huacho 2
4.1.7.- Tablas Cruzadas
Sistemas de Base de Datos
Prenda Color Cantidad
Camisa Blanco 5
Camisa Oscuro 13
Camisa Pastel 12
Chompa Blanco 6
Chompa Claro 9
Chompa Oscuro 11
Chompa Pastel 2
Pantalon Claro 1
Pantalon Oscuro 21
Pantalon Pastel 7
Polo Blanco 3
Polo Claro 8
Polo Oscuro 1
CrossTable1
Atributos de Medición
Atributos de Dimensión
3. DAI - Ing. Arturo Rozas Huacho 3
4.1.7.- Tablas Cruzadas
Sistemas de Base de Datos
Prenda Color Cantidad
Camisa Blanco 5
Camisa Oscuro 13
Camisa Pastel 12
Chompa Blanco 6
Chompa Claro 9
Chompa Oscuro 11
Chompa Pastel 2
Pantalon Claro 1
Pantalon Oscuro 21
Pantalon Pastel 7
Polo Blanco 3
Polo Claro 8
Polo Oscuro 1
CrossTable1
Prenda Blanco Claro Oscuro Pastel
Camisa 5 0 13 12
Chompa 6 9 11 2
Pantalon 0 1 21 7
Polo 3 8 1 0
Los valores del atributo de la dimensión Color se utilizan como
columnas en la nueva tabla.
Este tipo de resúmenes es el primer nivel de análisis de la
información y es una necesidad frecuente en el apoyo a la
toma de decisiones.
4. DAI - Ing. Arturo Rozas Huacho 4
4.1.7.- Tablas Cruzadas…
Sistemas de Base de Datos
Paso 1.- Supongamos que ya se tiene la siguiente tabla:
CrossTable1 (Prenda, Color, Cantidad)
A partir de ésta, generar una tabla temporal con
las siguientes Columnas:
Resultado(Prenda, Blanco, Claro, Oscuro)
select Prenda,
"Blanco" = case when Color = 'Blanco' then Cantidad else 0 end,
"Claro" = case when Color = 'Claro' then Cantidad else 0 end,
"Oscuro" = case when Color = 'Oscuro' then Cantidad else 0 end
into #Prenda
from CrossTable1
5. DAI - Ing. Arturo Rozas Huacho 5
4.1.7.- Tablas Cruzadas…
Sistemas de Base de Datos
select Prenda,
"Blanco" = case when Color = 'Blanco' then Cantidad else 0 end,
"Claro" = case when Color = 'Claro' then Cantidad else 0 end,
"Oscuro" = case when Color = 'Oscuro' then Cantidad else 0 end
into #Prenda
from CrossTable1
Prenda Color Cantidad
Camisa Blanco 5
Camisa Oscuro 13
Camisa Pastel 12
Chompa Blanco 6
Chompa Claro 9
Chompa Oscuro 11
Chompa Pastel 2
Pantalon Claro 1
Pantalon Oscuro 21
Pantalon Pastel 7
Polo Blanco 3
Polo Claro 8
Polo Oscuro 1
CrossTable1
Prenda Blanco Claro Oscuro
Camisa 5 0 0
Camisa 0 0 13
Camisa 0 0 0
Chompa 6 0 0
Chompa 0 9 0
Chompa 0 0 11
Chompa 0 0 0
Pantalon 0 1 0
Pantalon 0 0 21
Pantalon 0 0 0
Polo 3 0 0
Polo 0 8 0
Polo 0 0 1
#Prenda
6. DAI - Ing. Arturo Rozas Huacho 6
4.1.7.- Tablas Cruzadas…
Sistemas de Base de Datos
Paso 2.- Totalizar cada columna, considerando la prenda como
criterio de grupo.
select Prenda,
"Blanco" = sum(Blanco),
"Claro" = sum(Claro),
"Oscuro" = sum(Oscuro)
from #Prenda
group by Prenda
Prenda Blanco Claro Oscuro
Camisa 5 0 0
Camisa 0 0 13
Camisa 0 0 0
Chompa 6 0 0
Chompa 0 9 0
Chompa 0 0 11
Chompa 0 0 0
Pantalon 0 1 0
Pantalon 0 0 21
Pantalon 0 0 0
Polo 3 0 0
Polo 0 8 0
Polo 0 0 1
#Prenda
Prenda Blanco Claro Oscuro
Camisa 5 0 13
Chompa 6 9 11
Pantalon 0 1 21
Polo 3 8 1
Resultado
7. DAI - Ing. Arturo Rozas Huacho 7
4.1.7.- Tablas Cruzadas…
Sistemas de Base de Datos
Algoritmo genérico en un solo paso.
select Prenda,
"Blanco" = sum(case when Color = 'Blanco' then Cantidad else 0 end),
"Claro" = sum(case when Color = 'Claro' then Cantidad else 0 end),
"Oscuro" = sum(case when Color = 'Oscuro' then Cantidad else 0 end)
from CrossTable1
group by Prenda
Prenda Blanco Claro Oscuro
Camisa 5 0 13
Chompa 6 9 11
Pantalon 0 1 21
Polo 3 8 1
Resultado
Prenda Color Cantidad
Camisa Blanco 5
Camisa Oscuro 13
Camisa Pastel 12
Chompa Blanco 6
Chompa Claro 9
Chompa Oscuro 11
Chompa Pastel 2
Pantalon Claro 1
Pantalon Oscuro 21
Pantalon Pastel 7
Polo Blanco 3
Polo Claro 8
Polo Oscuro 1
CrossTable1
8. DAI - Ing. Arturo Rozas Huacho 8
4.1.7.- Tablas Cruzadas Dinámicas…
Sistemas de Base de Datos
En este tipo de tablas cruzadas no se conoce de
antemano el número de columnas. En consecuencia no
se puede aplicar el algoritmo anterior.
Prenda Color Cantidad
Camisa Blanco 5
Camisa Oscuro 13
Camisa Pastel 12
Chompa Blanco 6
Chompa Claro 9
Chompa Oscuro 11
Chompa Pastel 2
Pantalon Claro 1
Pantalon Oscuro 21
Pantalon Pastel 7
Polo Blanco 3
Polo Claro 8
Polo Oscuro 1
CrossTable1
Por ejemplo, de la anterior tabla
se desea analizar las unidades
Vendidas de todos los tipos de
Prenda y de todos los colores.
Prenda Blanco Claro Oscuro Pastel
Camisa 5 0 13 12
Chompa 6 9 11 2
Pantalon 0 1 21 7
Polo 3 8 1 0
9. DAI - Ing. Arturo Rozas Huacho 9
4.1.7.- Tablas Cruzadas Dinámicas…
Sistemas de Base de Datos
-- Generar tabla temporal con solo Color
select distinct cast(Color as varchar(2000)) Color
into #Color
from CrossTable1
order by Color;
-- Concatenar los Colores en la variable @Colores
declare @Colores varchar(2000);
set @Colores = '';
update #Color
set @Colores = Color = @Colores+','+Color;
-- Quitar primera coma
set @Colores = SubString(@Colores,2,2000);
-- Construir sentencia SQL que permita generar el Cross Table
declare @TextoSQL varchar(2000);
declare @Posicion int;
declare @Color varchar(12);
10. DAI - Ing. Arturo Rozas Huacho 10
4.1.7.- Tablas Cruzadas Dinámicas…
Sistemas de Base de Datos
set @TextoSQL = 'SELECT Prenda '
while @Colores <> ''
begin
-- Extraer Color
set @Posicion = CharIndex(',',@Colores);
if @Posicion > 0
begin
set @Color = SubString(@Colores,1,@Posicion-1);
set @Colores = SubString(@Colores,@Posicion+1,2000);
end
else
begin
set @Color = @Colores;
set @Colores = '';
end;
-- Crear sentencia SQL para Color
set @TextoSQL = @TextoSQL + ',"'+@Color+'"=SUM(case when Color =
'''+@Color+''' then Cantidad else '''' end)';
end; -- while
11. DAI - Ing. Arturo Rozas Huacho 11
4.1.7.- Tablas Cruzadas Dinámicas…
Sistemas de Base de Datos
set @TextoSQL = @TextoSQL + ' FROM CrossTable1 GROUP BY Prenda';
-- Ejecutar SQL
exec(@TextoSQL)
El contenido de la variable @TextoSQL es:
select Prenda,
"Blanco" = sum(case when Color = 'Blanco' then Cantidad else 0 end),
"Claro" = sum(case when Color = 'Claro' then Cantidad else 0 end),
"Oscuro" = sum(case when Color = 'Oscuro' then Cantidad else 0 end)
from CrossTable1
group by Prenda