lunes, 5 de octubre de 2015

Obtener datos externos - Desde una base de datos de SQL Server Analysis Services

Para ver una versión actualizada de esta entrada visita el blog de mi nuevo sitio www.dataXbi.com


La opción Desde una base de datos de SQL Server Analysis Services la encontramos en el grupo Desde una base de datos de la cinta de opciones Power Query

Esta opción nos permite conectarnos a un servidor de Analysis Services y crear una consulta a partir de los elementos de un cubo: dimensiones, medidas y filtros. El resultado será una tabla que contendrá como columnas los elementos seleccionados.




Cuando escogemos esta opción debemos proporcionar el nombre del servidor al que nos queremos conectar.



Si es la primera vez que accedemos al servidor desde Excel debemos proporcionar las credenciales para conectarnos al mismo.





La conexión al servidor puede demorar unos minutos y una vez que está hecha se abre el navegador que muestra organizado en una estructura de árbol los elementos disponibles: las bases de datos, cubos, dimesiones, medidas y filtros que podemos utilizar para crear la consulta. En este caso seleccionaremos el subcubo Sales.



Se muestra el Editor de consultas con una pestaña nueva Administrar que nos permite seleccionar los elementos con los que trabajaremos en la consulta.



La cinta de opciones Administrar solo contiene el grupo Modificar. La primera de sus opciones es Agregar elementos, donde podemos ver y seleccionar los elementos del cubo: dimensiones, medidas y filtros.



Al escoger esta opción se abre una ventana Agregar elementos que muestra el contenido del cubo seleccionado organizado en estructura arbórea. En la raíz de la jerarquía se encuentra el cubo seleccionado (Sales, en el ejemplo). Le siguen las carpetas que contienen las medidas y debajo de las carpetas están las dimensiones.




Seleccionamos las dimensiones con las que trabajaremos. En el ejemplo usaremos la dimensión Product.



En el panel de resultados del Editor de consultas se cargarán todos los atributos de la dimensión. Podemos eliminar los que no nos interese usar en la consulta.



A continuación agregaremos las medidas, seleccionaremos para el ejemplo las medidas Sales Amount y Sales Total Cost del grupo Sales.




En el panel de resultados del Editor de consultas se añaden dos nuevas columnas correspondientes a las medidas seleccionadas.



Una vez seleccionados todos los elementos que contendrá la consulta podemos realizar transformaciones para añadir, modificar o eliminar columnas. En el ejemplo añadiremos la columna Ganancias como resultado de restar la columna Sales Total Cost a la columna Sales Amount.



La columna Ganancias se añadirá en el panel de resultados del Editor de consultas, al final de la tabla.



La opción Contraer columnas del grupò Modificar  permite eliminar las columnas seleccionadas. En este caso eliminaremos todas las columnas excepto Product Category Name, Product Subcategory Name, Product name, Sales Total Cost, Sales Amount y Ganancias.



Después de realizar las transformaciones podemos cargar los datos en una hoja de calculo Excel o solo establecer la conexión a los datos seleccionando la opción Cerrar y cargar en..



Podemos marcar la opción Agregar estos datos al Modelo de datos para que estén disponibles en Power Pivot.



Al cargar los datos en una hoja de cálculo se crerá una hoja nueva que contendrá una tabla con los resultados de la consulta.



Si abrimos el Editor avanzado podemos ver las fórmulas empleadas para obtener este resultado.



Este mismo resultado podemos obtenerlo si hacemos todo el proceso manualmente en el Editor avanzado. Para ello necesitamos conocer que funciones del lenguaje debemos emplear y que parámetros son necesarios pasarles a cada función.


Hagamos todo el proceso manualmente

En la cinta de opciones Power Query, dentro del grupo Obtener datos externos, seleccionemos la opción Consulta en blanco en Desde otros orígenes.


Se abrirá la ventana del Editor de consultas
 


Abriremos el Editor avanzado y sustituiremos el valor de Origen por:

Origen = AnalysisServices.Databases("nombre_instancia_sql_server")




La función AnalysisServices.Databases pertenece a la categoría Accessing data y devuelve como resultado una tabla con las bases de datos del servidor de Analysis Services especifícado como parámetro.

 En el ejemplo el servidor solo contiene la base de datos Contoso_Retail.


Añadiremos la fórmula

Contoso_Retail = Origen{[Name="Contoso_Retail"]}[Data]

Las fórmulas se separan unas de otras utilizando la coma (,)




La consulta devolverá una tabla con los cubos contenidos en la base de dato.

En el ejemplo: Operation y Strategy Plan.




 A continuación añadiremos la fórmula

Operation = Contoso_Retail{[Id="Operation"]}[Data]
 


El resultado será una tabla que contiene los subcubos Inventory, IT Machine y Sales, del cubo Operation.




Si adicionamos la fórmula

Sales1 = Operation{[Id="Sales"]}[Data]


estaremos cargando los elementos del subcubo Sales para trabajar en el Editor de consultas. 




En la ventana del Editor de Consultas se mostrará la pestaña Administrar y podremos agregar a la consulta las medidas, dimensiones y filtros del subcubo Sales que hemos seleccionado.



Para específicar dichos elementos usaremos la función  Cube.Transform  que aplica la lista de funciones de transformación en el cubo especificado. 
 
En el ejemplo el cubo es Sales1 y añadiremos la dimensión Product a la consulta.
La fórmula quedaría así:

 #"Elementos agregados" = Cube.Transform(#"Sales1", {{Cube.AddAndExpandDimensionColumn, "[Product]", {"[Product].[Product Available For Sale Date].[Product Available For Sale Date]", "[Product].[Product Brand Name].[Product Brand Name]", "[Product].[Product Category Description].[Product Category Description]", "[Product].[Product Category Name].[Product Category Name]", "[Product].[Product Class].[Product Class]", "[Product].[Product Color].[Product Color]", "[Product].[Product Description].[Product Description]", "[Product].[Product Image URL].[Product Image URL]", "[Product].[Product Label].[Product Label]", "[Product].[Product Manufacturer].[Product Manufacturer]", "[Product].[Product Name].[Product Name]", "[Product].[Product Size Range].[Product Size Range]", "[Product].[Product Size Unit Measure].[Product Size Unit Measure]", "[Product].[Product Status].[Product Status]", "[Product].[Product Stock Type].[Product Stock Type]", "[Product].[Product Stop Sale Date].[Product Stop Sale Date]", "[Product].[Product Style].[Product Style]", "[Product].[Product Subcategory Description].[Product Subcategory Description]", "[Product].[Product Subcategory Label].[Product Subcategory Label]", "[Product].[Product Subcategory Name].[Product Subcategory Name]", "[Product].[Product Unit Of Measure].[Product Unit Of Measure]", "[Product].[Product URL].[Product URL]", "[Product].[Product Weight Unit Measure].[Product Weight Unit Measure]", "[Product].[Product].[Product Category Name]", "[Product].[Product].[Product Subcategory Name]", "[Product].[Product].[Product Name]"}, {"Product.Product Available For Sale Date", "Product.Product Brand Name", "Product.Product Category Description", "Product.Product Category Name", "Product.Product Class", "Product.Product Color", "Product.Product Description", "Product.Product Image URL", "Product.Product Label", "Product.Product Manufacturer", "Product.Product Name", "Product.Product Size Range", "Product.Product Size Unit Measure", "Product.Product Status", "Product.Product Stock Type", "Product.Product Stop Sale Date", "Product.Product Style", "Product.Product Subcategory Description", "Product.Product Subcategory Label", "Product.Product Subcategory Name", "Product.Product Unit Of Measure", "Product.Product URL", "Product.Product Weight Unit Measure", "Product.Product Category Name.1", "Product.Product Subcategory Name.1", "Product.Product Name.1"}}}) 


En este caso hemos seleccionado todos los atributos de la dimensión pero podimos haber escogido solo los que nos interesen.




En el Editor de consultas se muestra una tabla cuyas columnas son los atributos de la dimensión Pruduct




Usando la misma función, Cube.Transform, añadiremos las medidas con las que trabajaremos en la consulta: 

 #"Elementos agregados1" = Cube.Transform(#"Elementos agregados", {{Cube.AddMeasureColumn, "Sales Total Cost", "[Measures].[Sales Total Cost]"}, {Cube.AddMeasureColumn, "Sales Amount", "[Measures].[Sales Amount]"}})
 
En el ejemplo: Sales Amount y Sales Total Cost.




En el panel de resultados del Editor de consulta se mostrarán además de las dimensiones las medidas seleccionadas.




Finalmente cargamos los datos en una hoja de cálculo y obtenemos una tabla como la siguiente:
 

miércoles, 30 de septiembre de 2015

Obtener datos externos - Desde una base de datos SQL Server

Para ver una versión actualizada de esta entrada visita el blog de mi nuevo sitio www.dataXbi.com


Podemos importar datos desde una base de datos de una instancia de MS SQL Server usando los objetos Tablas y Vistas de la base de datos.

En el ejemplo utilizaremos la instancia de SQL Server Diana-PC y la base de datos Demo Database Nav (8-0).



Para crear la consulta desde de la cinta de opciones Power Query seleccionaremos la opción Obtener datos externos >> Desde una base de datos de SQL Server



Cuando escogemos esta opción se muestra la ventana Base de datos de SQL Server donde debemos específicar el nombre del servidor, el nombre de la base de datos (es opcional) y podemos especificar los datos que necesitamos a través de una instrucción SQL (tambien es opcional).





Al hacer clic en Aceptar, si es la primera vez que accedemos a la instancia de MS SQL Server, se abre la ventana Acceder a una Base de datos de SQL Server que nos solicitará las credenciales para conectarse al servidor.




Al presionar el botón conectar Power Query intenta conectarse al servidor, el proceso puede demorar unos minutos.



 
Una vez establecida la conexión al servidor si no hemos específicado una instrucción SQL se abre la ventana del Navegador y podemos escoger uno o varios elementos de la base de datos. Si en la ventana Base de datos de SQL Server no escribimos un nombre base de datos el Navegador mostrará la lista con las bases de datos contenidas en el servidor.


Si en la ventana Base de datos de SQL Server escribimos  una instrucción SQL se cargarán los datos sin necesidad de realizar ningún otro paso.



Cuando seleccionamos una tabla o vista en el panel de la izquierda del Navegador, su contenido se muestra en el panel de la derecha. 

Podemos seleccionar varias tablas y vistas de la base de datos marcando la casilla Seleccionar varios elementos y a continuación seleccionando la casilla delante de cada tabla o vista. 

Una vez que hemos seleccionado todos los elementos debemos decidir donde queremos ver los datos. Desplegamos la lista Cargar que se encuentra en la parte de inferior del panel de la derecha y escogemos la opción Cargar en.. Se abre la ventana Cargar donde podemos configurar como deseamos ver los datos.

Para este ejemplo dejaremos los valores por defecto. Los datos se cargarán en forma de tabla en una hoja de cálculo nueva.



 
Al presionar el botón Cargar se mostrarán los resultados en  hojas de cálculo. Se crearán tantas hojas nuevas como elementos de la base de datos se hayan seleccionado.

 

Si iniciamos el Editor de Consultas de Power Query podemos ver en el navegador las consultas que se han creado (una por cada elemento seleccionado). Al hacer clic en cualquiera de las consultas se cargarán los datos en el panel de resultados lo que nos permitirá realizar las transformaciones sobre los mismos.



 
En el Editor avanzado podremos ver las fórmulas aplicadas para obtener dichos resultados.





Podemos obtener los mismos resultados manualmente desde el Editor avanzado.


Construir la consulta Manualmente



Para ello en la cinta de opciones Power Query seleccionemos la opción Obtener datos externos >> Desde otros orígenes >> Consulta en blanco.



Se inicia el Editor de Consultas de Power Query. 



Abrimos el Editor avanzado.



Sustituimos el valor de Origen por:

Origen = Sql.Database("Diana-PC", "AdventureWorks2012")



 Al hacer clic en Listo se ejecutará la consulta y en el Editor de consultas tendremos una tabla conteniendo las tablas y vistas de la base de datos.



En el Editor avanzado añadiremos una nueva fórmula para indicar que usaremos la tabla Departament del esquema HumanResource.

Departamento = AdventureWorks2012{[Schema="HumanResources",Item="Department"]}[Data]



 Al presionar Listo en el panel de resultados del Editor de consultas tendremos el contenido de la tabla Departament.



Por último iniciemos el Editor avanzado y sustituyamos las fórmulas que aparecen por las siguientes:

 let
 Origen = Sql.Database("Diana-PC", "AdventureWorks2012", [Query="select       [NationalIDNumber], [FirstName], [MiddleName], [LastName], [JobTitle], [BirthDate] from [HumanResources].[Employee] E inner join [Person].[Person] P on P.BusinessEntityID = E.BusinessEntityID"])
in
    Origen 


En lugar de la función Sql.Databases usaremos sql.Database. Esta función admite tres parámetros: el primero es el nombre del servidor, el segundo el nombre de la base de datos y el tercero una consulta SQL.

En el ejemplo hemos seleccionado algunos campos de las tablas Employee y Person.




Al hacer clic en el botón Listo se mostrará la ventana Consulta de base de datos nativa, advirtiendonos que estamos a punto de ejecutar una consulta que puede modificar la base de datos.




Al presionar el botón Ejecutar se muestran los resultados en el Editor de consultas.