El documento explica cómo crear tablas cruzadas dinámicas a partir de una tabla de ventas que incluye el tipo de prenda, color y cantidad vendida. Se genera una tabla temporal con los colores únicos y se construye dinámicamente un query SQL que totaliza las cantidades por prenda y color para crear la tabla cruzada deseada sin conocer previamente las dimensiones.
More than Just Lines on a Map: Best Practices for U.S Bike Routes
Cross table
1. Sistemas de Base de Datos
4.1.7.- Tablas Cruzadas
Para entender el concepto de CrossTable1
tablas cruzadas, veamos el Prenda Color Cantidad
siguiente ejemplo: Camisa Blanco 5
Camisa Oscuro 13
Camisa Pastel 12
Chompa Blanco 6
Supongamos que se desea
Chompa Claro 9
Analizar las ventas por tipo de Chompa Oscuro 11
prenda y color. Chompa Pastel 2
Pantalon Claro 1
Pantalon Oscuro 21
En un proceso previo se obtuvo Pantalon Pastel 7
la siguiente tabla. Polo Blanco 3
Polo Claro 8
Polo Oscuro 1
DAI - Ing. Arturo Rozas Huacho 1
2. Sistemas de Base de Datos
4.1.7.- Tablas Cruzadas
CrossTable1
Prenda Color Cantidad
Camisa Blanco 5
Camisa Oscuro 13
Camisa Pastel 12
Chompa Blanco 6 Atributos de Medición
Chompa Claro 9
Chompa Oscuro 11
Chompa Pastel 2
Pantalon Claro 1
Atributos de Dimensión
Pantalon Oscuro 21
Pantalon Pastel 7
Polo Blanco 3
Polo Claro 8
Polo Oscuro 1
DAI - Ing. Arturo Rozas Huacho 2
3. Sistemas de Base de Datos
4.1.7.- Tablas Cruzadas
CrossTable1
Prenda Color Cantidad
Camisa Blanco 5
Camisa Oscuro 13
Camisa Pastel 12
Chompa Blanco 6
Chompa Claro 9
Chompa Oscuro 11 Prenda Blanco Claro Oscuro Pastel
Chompa Pastel 2 Camisa 5 0 13 12
Pantalon Claro 1 Chompa 6 9 11 2
Pantalon Oscuro 21 Pantalon 0 1 21 7
Pantalon Pastel 7 Polo 3 8 1 0
Polo Blanco 3
Polo Claro 8
Polo Oscuro 1
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 3
4. Sistemas de Base de Datos
4.1.7.- Tablas Cruzadas…
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 4
5. Sistemas de Base de Datos
4.1.7.- Tablas Cruzadas…
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
CrossTable1 #Prenda
Prenda Color Cantidad Prenda Blanco Claro Oscuro
Camisa Blanco 5 Camisa 5 0 0
Camisa Oscuro 13 Camisa 0 0 13
Camisa Pastel 12 Camisa 0 0 0
Chompa Blanco 6 Chompa 6 0 0
Chompa Claro 9 Chompa 0 9 0
Chompa Oscuro 11 Chompa 0 0 11
Chompa Pastel 2 Chompa 0 0 0
Pantalon Claro 1 Pantalon 0 1 0
Pantalon Oscuro 21 Pantalon 0 0 21
Pantalon Pastel 7 Pantalon 0 0 0
Polo Blanco 3 Polo 3 0 0
Polo Claro 8 Polo 0 8 0
Polo Oscuro 1 Polo 0 0 1
DAI - Ing. Arturo Rozas Huacho 5
6. Sistemas de Base de Datos
4.1.7.- Tablas Cruzadas…
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
Prenda Blanco Claro Oscuro
Camisa 5 0 0
Camisa 0 0 13
Camisa 0 0 0 Resultado
Chompa 6 0 0
Prenda Blanco Claro Oscuro
Chompa 0 9 0
Camisa 5 0 13
Chompa 0 0 11
Chompa 6 9 11
Chompa 0 0 0
Pantalon 0 1 21
Pantalon 0 1 0
Polo 3 8 1
Pantalon 0 0 21
Pantalon 0 0 0
Polo 3 0 0
Polo 0 8 0
Polo 0 0 1
DAI - Ing. Arturo Rozas Huacho 6
7. Sistemas de Base de Datos
4.1.7.- Tablas Cruzadas…
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
CrossTable1
Prenda Color Cantidad
Camisa Blanco 5
Camisa Oscuro 13
Camisa Pastel 12
Chompa Blanco 6 Resultado
Chompa Claro 9 Prenda Blanco Claro Oscuro
Chompa Oscuro 11 Camisa 5 0 13
Chompa Pastel 2 Chompa 6 9 11
Pantalon Claro 1 Pantalon 0 1 21
Pantalon Oscuro 21 Polo 3 8 1
Pantalon Pastel 7
Polo Blanco 3
Polo Claro 8
Polo Oscuro 1
DAI - Ing. Arturo Rozas Huacho 7
8. Sistemas de Base de Datos
4.1.7.- Tablas Cruzadas Dinámicas…
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.
CrossTable1
Prenda Color Cantidad
Camisa Blanco 5 Por ejemplo, de la anterior tabla
Camisa Oscuro 13 se desea analizar las unidades
Camisa Pastel 12
Vendidas de todos los tipos de
Chompa Blanco 6
Chompa Claro 9 Prenda y de todos los colores.
Chompa Oscuro 11
Chompa Pastel 2
Pantalon Claro 1 Prenda Blanco Claro Oscuro Pastel
Pantalon Oscuro 21 Camisa 5 0 13 12
Pantalon Pastel 7 Chompa 6 9 11 2
Polo Blanco 3 Pantalon 0 1 21 7
Polo Claro 8 Polo 3 8 1 0
Polo Oscuro 1
DAI - Ing. Arturo Rozas Huacho 8
9. Sistemas de Base de Datos
4.1.7.- Tablas Cruzadas Dinámicas…
-- 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 9
10. Sistemas de Base de Datos
4.1.7.- Tablas Cruzadas Dinámicas…
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 10
11. Sistemas de Base de Datos
4.1.7.- Tablas Cruzadas Dinámicas…
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
DAI - Ing. Arturo Rozas Huacho 11