Con motivo de un próximo artículo que dedicaremos a la elaboración de pirámides de población desde PowerPivot, nos hemos encontrado recientemente ante la tesitura de desarrollar un proceso para crear una base de datos con información demográfica, que sirva como punto de partida para la construcción del modelo de datos en PowerPivot.
A diferencia del artículo Generar datos de prueba para SQL Server desde Excel (1 y 2), publicado anteriormente en este mismo blog, donde utilizábamos Excel para generar datos ficticios, también de población, en esta ocasión trabajaremos con datos reales, los cuales representan un mayor volumen de información a manejar con respecto al mencionado artículo.
El objetivo del presente artículo consistirá en crear una base de datos que contenga una tabla de población, en la que cada registro represente a un individuo, con su correspondiente edad, sexo y zona de atención sanitaria.
Antes de proseguir, quisiera expresar mi agradecimiento a Ricard Gènova Maleras, demógrafo especializado en análisis poblacionales sanitarios, perteneciente al Servicio de Informes de Salud y Estudios (Subdirección de Promoción de la Salud y Prevención, DG Atención Primaria, Consejería Sanidad CM), por su valioso asesoramiento en aquellos aspectos demográficos esenciales para la elaboración de éste y el próximo artículo sobre pirámides de población, así como al resto de integrantes del mencionado Servicio: Jenaro Astray Mochales, María Felicitas Domínguez Berjón y María Dolores Esteban Vasallo, por su apoyo y ayuda en el resto de conceptos sanitarios relacionados con poblaciones, necesarios para el adecuado enfoque de este artículo.
Por último, aunque no menos importante, agradezco a Enrique Barceló, compañero de fatigas en estas labores del Business Intelligence, los interesantes ratos que pasamos departiendo acerca de los aspectos relacionados con el desarrollo de sistemas de información en general, y sobre cubos de datos en particular, así como por compartir conmigo sus asombrosos conocimientos sobre OLAP.
Obtención y preparación de los datos
Existe un importante número de sitios Web, pertenecientes a diversos organismos, donde encontraremos la información demográfica necesaria para realizar nuestros análisis, organizada por criterios tales como sexo, edad, región geográfica, etc. De todos estos organismos destacaremos los correspondientes a Naciones Unidas, Instituto Nacional de Estadística (España), Instituto de Estadística de la CM (Madrid) y CELADE (datos demográficos de América Latina y Caribe). En todos ellos, además de la consulta directa en la propia web, disponemos de la posibilidad de descargar la información en diversos formatos tales como Excel, CSV, etc.
Para el desarrollo de los ejemplos de este artículo utilizaremos los datos del padrón de población de la Comunidad de Madrid correspondientes al año 2010, clasificados por edad, sexo y la nueva zonificación sanitaria, vigente a partir de dicho año, que se encuentran en el siguiente enlace (T10Z2_SALUD10) de la página web del Instituto de Estadística de la CM.
Estrategia para la extracción de datos
El archivo Excel pc10t10z2_salud10.xls, obtenido del anterior enlace, organiza los datos de población alrededor de tres hojas de cálculo que contienen, respectivamente, los valores de población totales, por hombres y mujeres.
Cada hoja de cálculo tiene en sus dos primeras columnas el código y nombre de la zona de atención sanitaria, mientras que el resto de las columnas contienen las cifras de población clasificadas en agrupaciones quinquenales, donde para cada grupo existe una columna con el total quinquenal, y varias columnas que representan el desglose por edad simple de las edades que conforman el grupo.
Los datos que necesitamos extraer son, por un lado, los códigos y nombres de la zonificación sanitaria, para lo que podemos usar cualquiera de las hojas de cálculo del archivo Excel. Por otra parte, tendremos que obtener el total quinquenal de cada grupo de edad, tanto de la hoja de población masculina como femenina.
Todos estos valores los llevaremos a una nueva hoja de cálculo en la que copiaremos cada combinación de códigos de zona sanitaria, grupo de edad y tipo de población (hombre/mujer) siguiendo un orden de pasos parecido al de la siguiente figura.
A continuación observamos una aproximación de lo que sería la hoja de cálculo resultante.
El empleo manual de las operaciones seleccionar, copiar y pegar, para traspasar los datos que necesitamos a una nueva hoja puede resultar una tarea muy laboriosa y pesada. Es por ello que proponemos el uso de una macro que automatice toda esta labor, lo que nos permitirá repetir el proceso cuantas veces queramos, así como aplicarlo a otras poblaciones cuyos datos se encuentren estructurados de la misma forma.
Para crear la macro, en la cinta de opciones de Excel haremos clic en la opción «Macros», perteneciente al grupo del mismo nombre situado en la ficha «Vista».
Esta opción también está disponible en la ficha «Programador» dentro del grupo «Código»
En el caso de que la ficha «Programador» no esté visible haremos clic en la ficha «Archivo», y dentro de esta en «Opciones». En la ventana «Opciones de Excel» haremos clic en «Personalizar cinta de opciones», y desplegando la lista situada a la derecha seleccionaremos el elemento «Fichas principales». Del panel situado debajo de la lista marcaremos la casilla «Programador», lo que hará visible esta ficha en la cinta de opciones.
Independientemente del modo elegido para su creación, aparecerá la ventana «Macro», en la que daremos el nombre «TraspasarDatosPoblacion» a nuestra macro y haremos clic en «Crear», lo que nos llevará al editor de VBA (Visual Basic for Applications), donde escribiremos el código de la macro.
Vamos a dividir el trabajo que realizará la macro en tres partes: la creación de los datos para la columna de códigos de zona sanitaria; la columna de rangos de edad; y por último, las columnas de cantidades de población por sexo.
En el siguiente bloque de código podemos ver las instrucciones encargadas de crear una nueva hoja de cálculo, a la que asignaremos un nombre y los títulos de columna. Posteriormente seleccionaremos los códigos de zona de una de las hojas origen, que pegaremos en la nueva hoja tantas veces como rangos de edad existan.
Option Explicit Private Const RANGOS_COLUMNAS As Integer = 20 Sub TraspasarDatosPoblacion() ' crear nueva hoja y asignarle nombre Dim sHojaDestino As String sHojaDestino = "DatosBasePoblacion" Dim oWorksheet As Worksheet Set oWorksheet = Sheets.Add(After:=Sheets(Sheets.Count)) oWorksheet.Name = sHojaDestino ' asignar títulos en columnas Range("A1").Select ActiveCell.FormulaR1C1 = "Zona" Range("B1").Select ActiveCell.FormulaR1C1 = "Rango_Edad" Range("C1").Select ActiveCell.FormulaR1C1 = "Poblacion_H" Range("D1").Select ActiveCell.FormulaR1C1 = "Poblacion_M" ' volver a la hoja de datos origen Sheets("Hombres").Select ' establecer fila inicial y final de datos Dim sFilaInicial As String Dim sFilaFinal As String sFilaInicial = "14" sFilaFinal = "299" ' calcular cantidad de zonas existentes Dim nCantidadZonas As Integer nCantidadZonas = (CInt(sFilaFinal) - CInt(sFilaInicial)) ' códigos de zona ' --------------- Dim sColumna As String sColumna = "A" ' seleccionar códigos, copiarlos al portapapeles y pegarlos en nueva hoja Range(sColumna & sFilaInicial & ":" & sColumna & sFilaFinal).Select Selection.Copy Sheets(sHojaDestino).Select Dim nContador As Integer Dim nFilaVacia As Long ' realizar el pegado por cada grupo de edad For nContador = 0 To RANGOS_COLUMNAS ' obtener el siguiente número de fila vacío de la columna nFilaVacia = FilaVaciaEnColumna(1) ' posicionar en celda Range(sColumna & CStr(nFilaVacia)).Select ' pegar datos ActiveSheet.Paste Next ' asignar fondo color blanco a columna Columns("A:A").Select Selection.Interior.Pattern = xlNone Selection.Interior.TintAndShade = 0 Selection.Interior.PatternTintAndShade = 0
Antes de cada operación de asignación de valores en las celdas, necesitamos conocer la fila vacía a partir de la que pegaremos los datos, para lo que utilizaremos la función auxiliar «FilaVaciaEnColumna», que recorrerá la colección de filas de la hoja hasta encontrar la fila que contiene una celda vacía en aquella columna sobre la que estamos operando.
Function FilaVaciaEnColumna(ByVal nPosicionCelda As Integer) As Long Dim vFila As Variant Dim nFila As Long For Each vFila In ActiveSheet.Rows nFila = vFila.Row If vFila.Cells(nPosicionCelda).Text = "" Then Exit For End If Next FilaVaciaEnColumna = nFila End Function
La siguiente fase en la creación de la macro consistirá en asignar los valores a la columna de rangos de edad. Para ello crearemos un array conteniendo dichos valores, y al recorrerlo, haremos que en cada iteración se copie el valor del rango en curso el mismo número de veces que la cantidad de zonas sanitarias existentes. Cabe destacar que antes de asignar los valores a esta columna le aplicaremos el formato texto (propiedad Selection.NumberFormat), ya que en caso contrario, el formato predeterminado puede hacer que algunos valores de los rangos de edad sean interpretados como mes-año.
' rangos de edad ' -------------- Dim aRangosEdad(RANGOS_COLUMNAS) As String aRangosEdad(0) = "0-4" aRangosEdad(1) = "5-9" aRangosEdad(2) = "10-14" aRangosEdad(3) = "15-19" aRangosEdad(4) = "20-24" aRangosEdad(5) = "25-29" aRangosEdad(6) = "30-34" aRangosEdad(7) = "35-39" aRangosEdad(8) = "40-44" aRangosEdad(9) = "45-49" aRangosEdad(10) = "50-54" aRangosEdad(11) = "55-59" aRangosEdad(12) = "60-64" aRangosEdad(13) = "65-69" aRangosEdad(14) = "70-74" aRangosEdad(15) = "75-79" aRangosEdad(16) = "80-84" aRangosEdad(17) = "85-89" aRangosEdad(18) = "90-94" aRangosEdad(19) = "95-99" aRangosEdad(20) = "100+" ' establecer el formato de la columna de edad a texto sColumna = "B" Columns(sColumna & ":" & sColumna).Select Selection.NumberFormat = "@" ' repetir cada valor del array aRangosEdad ' tantas veces como número de zonas existen Dim vRangoEdad As Variant For Each vRangoEdad In aRangosEdad ' obtener el siguiente número de fila vacío de la columna nFilaVacia = FilaVaciaEnColumna(2) ' asignar el valor del rango de edad en las dos siguientes celdas hacia abajo Range(sColumna & CStr(nFilaVacia)).Select ActiveCell.FormulaR1C1 = vRangoEdad Range(sColumna & CStr(nFilaVacia + 1)).Select ActiveCell.FormulaR1C1 = vRangoEdad ' establecer el rango de celdas y rellenar con el valor de las anteriores celdas Range(sColumna & CStr(nFilaVacia) & ":" & sColumna & CStr(nFilaVacia + 1)).Select Selection.AutoFill Destination:=Range(sColumna & CStr(nFilaVacia) & ":" & sColumna & CStr(nFilaVacia + nCantidadZonas)), Type:=xlFillDefault Next
Y terminaremos la macro con la asignación de las columnas dedicadas a las cifras de población por sexo, donde esta vez utilizaremos dos arrays combinados, conteniendo las cabeceras de columna que corresponden a los totales quinquenales de población, y el tipo de población. Al recorrer ambos de forma anidada, iremos extrayendo, para un tipo de población determinado, sus cifras de individuos, asignándolas a la hoja de cálculo destino.
' cifras de población por sexo ' ---------------------------- Dim aColumnasPoblacion(RANGOS_COLUMNAS) As String aColumnasPoblacion(0) = "D" aColumnasPoblacion(1) = "J" aColumnasPoblacion(2) = "P" aColumnasPoblacion(3) = "V" aColumnasPoblacion(4) = "AB" aColumnasPoblacion(5) = "AH" aColumnasPoblacion(6) = "AN" aColumnasPoblacion(7) = "AT" aColumnasPoblacion(8) = "AZ" aColumnasPoblacion(9) = "BF" aColumnasPoblacion(10) = "BL" aColumnasPoblacion(11) = "BR" aColumnasPoblacion(12) = "BX" aColumnasPoblacion(13) = "CD" aColumnasPoblacion(14) = "CJ" aColumnasPoblacion(15) = "CP" aColumnasPoblacion(16) = "CV" aColumnasPoblacion(17) = "DB" aColumnasPoblacion(18) = "DH" aColumnasPoblacion(19) = "DN" aColumnasPoblacion(20) = "DT" Dim aTiposPoblacionColumnas(1) As String aTiposPoblacionColumnas(0) = "Hombres,C,3" aTiposPoblacionColumnas(1) = "Mujeres,D,4" Dim vTipoPoblacionColumna As Variant Dim sTipoPoblacion As String Dim nPosicionColumna As Integer Dim vColumnaPoblacion As Variant ' por cada tipo de población For Each vTipoPoblacionColumna In aTiposPoblacionColumnas ' obtener la información del tipo de población: ' sexo, columna destino, posición numérica columna destino sTipoPoblacion = Split(vTipoPoblacionColumna, ",")(0) sColumna = Split(vTipoPoblacionColumna, ",")(1) nPosicionColumna = Split(vTipoPoblacionColumna, ",")(2) ' recorrer las columnas que contienen las cifras de población ' y pegarlas en la nueva hoja For Each vColumnaPoblacion In aColumnasPoblacion ' posicionar en hoja con datos origen población Sheets(sTipoPoblacion).Select ' seleccionar celdas y copiarlas Range(vColumnaPoblacion & sFilaInicial & ":" & vColumnaPoblacion & sFilaFinal).Select Selection.Copy ' posicionar en hoja destino de los datos Sheets(sHojaDestino).Select ' obtener siguiente fila vacía, posicionar en celda y pegar los datos nFilaVacia = FilaVaciaEnColumna(nPosicionColumna) Range(sColumna & CStr(nFilaVacia)).Select ActiveSheet.Paste Next Next ' cambiar estilo de columnas para que se visualicen bordes de celdas Columns("C:D").Select Selection.Style = "Normal" Range("A1").Select End Sub
Seguidamente crearemos una nueva macro con el nombre «TraspasarDatosZonificacion», que trasladará a una nueva hoja del archivo Excel los códigos y nombres de las zonas de asistencia sanitaria. Estos datos servirán para cargar una de las tablas catálogo de la base de datos que crearemos más adelante.
Sub TraspasarDatosZonificacion() ' crear nueva hoja y asignarle nombre Dim sHojaDestino As String sHojaDestino = "DatosZonificacion" Dim oWorksheet As Worksheet Set oWorksheet = Sheets.Add(After:=Sheets(Sheets.Count)) oWorksheet.Name = sHojaDestino ' poner títulos de columna Range("A1").Select ActiveCell.FormulaR1C1 = "Zona_ID" Range("B1").Select ActiveCell.FormulaR1C1 = "Zona_DS" ' volver a la hoja de datos Sheets("Hombres").Select ' copiar códigos y nombres de zonas al portapapeles Range("A14:B299").Select Selection.Copy ' volver a hoja destino y pegar los datos Sheets(sHojaDestino).Select Range("A2").Select ActiveSheet.Paste ' quitar color de fondo de celdas Columns("A:B").Select Selection.Interior.Pattern = xlNone Selection.Interior.TintAndShade = 0 Selection.Interior.PatternTintAndShade = 0 Range("A1").Select End Sub
Cuando copiamos los códigos y nombres de las zonas sanitarias a las nuevas hojas dentro del archivo Excel, también se copia la configuración de colores de las celdas correspondientes a estos valores. Para conseguir que el color de fondo de estas celdas sea blanco utilizamos las siguientes líneas de código.
Selection.Interior.TintAndShade = 0 Selection.Interior.PatternTintAndShade = 0
Pero si nuestra versión de Excel es anterior a 2007 estas líneas producirán un error en tiempo de ejecución, por lo que deberemos comentarlas para evitar que sean ejecutadas.
Finalmente, desde la ventana de administración de macros, seleccionaremos cada una y haremos clic en «Ejecutar».
Como resultado obtendremos dos nuevas hojas con los datos generados por el código de las macros.
Creación de la base de datos
Nuestro próximo paso consistirá en crear la base de datos PiramidePoblacion, que alojará la información que acabamos de preparar en Excel. El siguiente bloque de código muestra el script de Transact-SQL que tendremos que ejecutar en nuestra instancia de SQL Server (la versión utilizada en este artículo ha sido SQL Server 2008 R2).
CREATE DATABASE PiramidePoblacion GO USE PiramidePoblacion GO CREATE TABLE DatosBasePoblacion ( Fila_ID int IDENTITY(1,1) NOT NULL, Zona varchar(3) NULL, Rango_Edad varchar(10) NULL, Poblacion_H int NULL, Poblacion_M int NULL ) GO CREATE TABLE Poblacion ( Fila_ID int IDENTITY(1,1) NOT NULL, Zona_ID varchar(3) NULL, Edad_ID int NULL, Sexo_ID char(1) NULL, CONSTRAINT PK_Poblacion PRIMARY KEY CLUSTERED (Fila_ID ASC) ) GO CREATE TABLE Zona ( Zona_ID varchar(3) NOT NULL, Zona_DS varchar(30) NULL, CONSTRAINT PK_Zona PRIMARY KEY CLUSTERED (Zona_ID ASC) ) GO CREATE TABLE Edad ( Edad_ID int NOT NULL, Edad_Grupo varchar(20) NULL, CONSTRAINT PK_Edad PRIMARY KEY CLUSTERED (Edad_ID ASC) ) GO CREATE TABLE Sexo ( Sexo_ID char(1) NOT NULL, Sexo_DS varchar(10) NULL, CONSTRAINT PK_Sexo PRIMARY KEY CLUSTERED (Sexo_ID ASC) ) GO
La tabla Población, como podemos adivinar por su nombre, será la que contenga los datos principales de nuestra población, mientras que las tablas Zona, Edad y Sexo contendrán información de catálogo (código/descriptor).
Con toda seguridad, en el script habremos notado la carencia de claves ajenas entre la tabla Población y el resto. Se trata de un olvido intencionado, ya que en el próximo artículo sobre pirámides de población esto nos servirá para demostrar cómo a través de PowerPivot también es posible crear relaciones entre las tablas del modelo.
Después de ejecutar el script, la primera acción que realizaremos en la nueva base de datos será el volcado, desde el archivo pc10t10z2_salud10.xls, de la hoja de cálculo DatosBasePoblacion en la tabla del mismo nombre, utilizando la siguiente sentencia.
INSERT INTO DatosBasePoblacion SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 8.0;Database=C:DatosOrigenpc10t10z2_salud10.xls', 'SELECT * FROM [DatosBasePoblacion$]')
Generando los registros de población en la base de datos
La finalidad del proceso que estamos llevando a cabo hasta este momento consiste en generar, para la tabla Población, una cantidad de registros que represente a la población con la que vamos a trabajar, y que será igual a la suma de las columnas Poblacion_H y Poblacion_M de la tabla DatosBasePoblacion.
Para tal volumen de datos, el uso de un bucle que vaya creando uno a uno los registros resulta totalmente inviable por cuestiones de tiempo y rendimiento, por lo que debemos buscar un sistema alternativo, que nos permita trabajar utilizando conjuntos de resultados, para poder crear la cantidad de registros que necesitamos empleando un reducido número de operaciones.
La técnica por la que vamos a decantarnos se muestra en el libro Microsoft SQL Server 2008: T-SQL Querying, escrito por Itzik Ben-Gan junto a otros grandes nombres de SQL Server: Lubor Kollar, Dejan Sarka y Steve Kass; y consiste en utilizar varias «Expresiones Comunes de Tabla» o CTE (Common Table Expression) anidadas, mediante las cuales generaremos un conjunto de resultados del tamaño necesario, que combinaremos con una sentencia INSERT INTO, para añadir a la tabla Población un número de registros determinado. Todo ello lo incluiremos en el siguiente procedimiento almacenado.
CREATE PROCEDURE GenerarRegistrosPoblacion @sZona_ID AS varchar(3), @sRango_Edad AS varchar(10), @sSexo_ID AS char(1), @nPoblacion AS int AS BEGIN DECLARE @nEdad_ID AS int = CASE WHEN CHARINDEX('-',@sRango_Edad) = 0 THEN 100 WHEN CHARINDEX('-',@sRango_Edad) = 2 THEN CAST(LEFT(@sRango_Edad,1) AS int) WHEN CHARINDEX('-',@sRango_Edad) = 3 THEN CAST(LEFT(@sRango_Edad,2) AS int) END; WITH Numeros0 AS (SELECT 1 AS Numero UNION ALL SELECT 1), Numeros1 AS (SELECT 1 AS Numero FROM Numeros0 AS TblPrim CROSS JOIN Numeros0 AS TblSeg), Numeros2 AS (SELECT 1 AS Numero FROM Numeros1 AS TblPrim CROSS JOIN Numeros1 AS TblSeg), Numeros3 AS (SELECT 1 AS Numero FROM Numeros2 AS TblPrim CROSS JOIN Numeros2 AS TblSeg), Numeros4 AS (SELECT 1 AS Numero FROM Numeros3 AS TblPrim CROSS JOIN Numeros3 AS TblSeg), Numeros5 AS (SELECT 1 AS Numero FROM Numeros4 AS TblPrim CROSS JOIN Numeros4 AS TblSeg), NumerosTotal AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 0)) AS NumeroFila FROM Numeros5) INSERT INTO Poblacion SELECT @sZona_ID, @nEdad_ID, @sSexo_ID FROM NumerosTotal WHERE NumeroFila <= @nPoblacion; END GO
A continuación escribiremos un script en el que recorreremos la tabla DatosBasePoblacion, y por cada uno de sus registros tomaremos el valor de los campos Poblacion_H y Poblacion_M, insertando en la tabla Población, mediante la ejecución del procedimiento almacenado GenerarRegistrosPoblacion, un número de filas igual al valor de los mencionados campos.
DECLARE @nContador AS int = 1; DECLARE @nDatosBaseFilaFinal AS int = (SELECT MAX(Fila_ID) FROM DatosBasePoblacion); DECLARE @sZona AS varchar(3); DECLARE @sRango_Edad AS varchar(10); DECLARE @nPoblacion_H AS int; DECLARE @nPoblacion_M AS int; WHILE (@nContador <= @nDatosBaseFilaFinal) BEGIN SELECT @sZona = Zona, @sRango_Edad = Rango_Edad, @nPoblacion_H = Poblacion_H, @nPoblacion_M = Poblacion_M FROM DatosBasePoblacion WHERE Fila_ID = @nContador; EXECUTE GenerarRegistrosPoblacion @sZona, @sRango_Edad, 'H', @nPoblacion_H EXECUTE GenerarRegistrosPoblacion @sZona, @sRango_Edad, 'M', @nPoblacion_M SET @nContador += 1 END
El tiempo empleado en la ejecución de este script ha sido de 1 minuto y 37 segundos en una máquina virtual dotada de una CPU Core 2 Duo y 1,5 GB de RAM, lo cual representa un excelente rendimiento, dado el elevado número de registros añadidos a la tabla Población.
Terminamos las operaciones de preparación de la base de datos con las sentencias utilizadas para añadir datos en las tablas que actuarán como catálogos de la tabla Población. Como vemos a continuación, para la tabla Zona también obtenemos los registros del archivo pc10t10z2_salud10.xls.
--//// INSERT INTO Zona SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 8.0;Database=C:DatosOrigenpc10t10z2_salud10.xls', 'SELECT * FROM [DatosZonificacion$]') --//// DECLARE @nContador AS int = 0; WHILE (@nContador <= 120) BEGIN INSERT INTO Edad SELECT @nContador, CASE WHEN @nContador BETWEEN 0 AND 4 THEN '000-004' WHEN @nContador BETWEEN 5 AND 9 THEN '005-009' WHEN @nContador BETWEEN 10 AND 14 THEN '010-014' WHEN @nContador BETWEEN 15 AND 19 THEN '015-019' WHEN @nContador BETWEEN 20 AND 24 THEN '020-024' WHEN @nContador BETWEEN 25 AND 29 THEN '025-029' WHEN @nContador BETWEEN 30 AND 34 THEN '030-034' WHEN @nContador BETWEEN 35 AND 39 THEN '035-039' WHEN @nContador BETWEEN 40 AND 44 THEN '040-044' WHEN @nContador BETWEEN 45 AND 49 THEN '045-049' WHEN @nContador BETWEEN 50 AND 54 THEN '050-054' WHEN @nContador BETWEEN 55 AND 59 THEN '055-059' WHEN @nContador BETWEEN 60 AND 64 THEN '060-064' WHEN @nContador BETWEEN 65 AND 69 THEN '065-069' WHEN @nContador BETWEEN 70 AND 74 THEN '070-074' WHEN @nContador BETWEEN 75 AND 79 THEN '075-079' WHEN @nContador BETWEEN 80 AND 84 THEN '080-084' WHEN @nContador BETWEEN 85 AND 89 THEN '085-089' WHEN @nContador BETWEEN 90 AND 94 THEN '090-094' WHEN @nContador BETWEEN 95 AND 99 THEN '095-099' WHEN @nContador >= 100 THEN '100+' END SET @nContador += 1; END --//// INSERT INTO Sexo VALUES ('H','Hombre') INSERT INTO Sexo VALUES ('M','Mujer')
Carga de datos completada
Llegados a este punto podemos dar por finalizado el proceso de creación y carga de información demográfica en nuestra base de datos. Como hemos comentado al comienzo, en un próximo artículo utilizaremos esta base de datos como punto de partida para la construcción de pirámides de población con PowerPivot.
anonymous
Una pirámide poblacional es una herramienta que nos permite analizar el estado y evolución
anonymous
A population pyramid is a tool that allows to analyze the status and evolution of a population based