Upload
richard-castro
View
139
Download
2
Embed Size (px)
Citation preview
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 CantidadCamisa Blanco 5Camisa Oscuro 13Camisa Pastel 12Chompa Blanco 6Chompa Claro 9Chompa Oscuro 11Chompa Pastel 2Pantalon Claro 1Pantalon Oscuro 21Pantalon Pastel 7Polo Blanco 3Polo Claro 8Polo Oscuro 1
CrossTable1
DAI - Ing. Arturo Rozas Huacho
2
4.1.7.- Tablas Cruzadas
Sistemas de Base de Datos
Prenda Color CantidadCamisa Blanco 5Camisa Oscuro 13Camisa Pastel 12Chompa Blanco 6Chompa Claro 9Chompa Oscuro 11Chompa Pastel 2Pantalon Claro 1Pantalon Oscuro 21Pantalon Pastel 7Polo Blanco 3Polo Claro 8Polo Oscuro 1
CrossTable1
Atributos de Medición
Atributos de Dimensión
DAI - Ing. Arturo Rozas Huacho
3
4.1.7.- Tablas CruzadasSistemas de Base de Datos
Prenda Color CantidadCamisa Blanco 5Camisa Oscuro 13Camisa Pastel 12Chompa Blanco 6Chompa Claro 9Chompa Oscuro 11Chompa Pastel 2Pantalon Claro 1Pantalon Oscuro 21Pantalon Pastel 7Polo Blanco 3Polo Claro 8Polo Oscuro 1
CrossTable1
Prenda Blanco Claro Oscuro PastelCamisa 5 0 13 12Chompa 6 9 11 2Pantalon 0 1 21 7Polo 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.
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
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 CantidadCamisa Blanco 5Camisa Oscuro 13Camisa Pastel 12Chompa Blanco 6Chompa Claro 9Chompa Oscuro 11Chompa Pastel 2Pantalon Claro 1Pantalon Oscuro 21Pantalon Pastel 7Polo Blanco 3Polo Claro 8Polo Oscuro 1
CrossTable1Prenda Blanco Claro OscuroCamisa 5 0 0Camisa 0 0 13Camisa 0 0 0Chompa 6 0 0Chompa 0 9 0Chompa 0 0 11Chompa 0 0 0Pantalon 0 1 0Pantalon 0 0 21Pantalon 0 0 0Polo 3 0 0Polo 0 8 0Polo 0 0 1
#Prenda
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 OscuroCamisa 5 0 0Camisa 0 0 13Camisa 0 0 0Chompa 6 0 0Chompa 0 9 0Chompa 0 0 11Chompa 0 0 0Pantalon 0 1 0Pantalon 0 0 21Pantalon 0 0 0Polo 3 0 0Polo 0 8 0Polo 0 0 1
#Prenda
Prenda Blanco Claro OscuroCamisa 5 0 13Chompa 6 9 11Pantalon 0 1 21Polo 3 8 1
Resultado
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 OscuroCamisa 5 0 13Chompa 6 9 11Pantalon 0 1 21Polo 3 8 1
Resultado
Prenda Color CantidadCamisa Blanco 5Camisa Oscuro 13Camisa Pastel 12Chompa Blanco 6Chompa Claro 9Chompa Oscuro 11Chompa Pastel 2Pantalon Claro 1Pantalon Oscuro 21Pantalon Pastel 7Polo Blanco 3Polo Claro 8Polo Oscuro 1
CrossTable1
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 CantidadCamisa Blanco 5Camisa Oscuro 13Camisa Pastel 12Chompa Blanco 6Chompa Claro 9Chompa Oscuro 11Chompa Pastel 2Pantalon Claro 1Pantalon Oscuro 21Pantalon Pastel 7Polo Blanco 3Polo Claro 8Polo Oscuro 1
CrossTable1
Por ejemplo, de la anterior tablase desea analizar las unidadesVendidas de todos los tipos de Prenda y de todos los colores.
Prenda Blanco Claro Oscuro PastelCamisa 5 0 13 12Chompa 6 9 11 2Pantalon 0 1 21 7Polo 3 8 1 0
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);
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
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