{"id":760,"date":"2018-12-13T16:17:00","date_gmt":"2018-12-13T15:17:00","guid":{"rendered":"https:\/\/trainingpowerbi.wordpress.com\/2019\/03\/21\/header-detail\/"},"modified":"2020-05-04T13:12:42","modified_gmt":"2020-05-04T11:12:42","slug":"header-detail","status":"publish","type":"post","link":"https:\/\/bicontrolling.com\/index.php\/2018\/12\/13\/header-detail\/","title":{"rendered":"Estructuras jer\u00e1rquicas en tablas de hechos"},"content":{"rendered":"<h4>Introducci\u00f3n<\/h4>\n<p>Un escenario muy frecuente cuando utilizamos bases de datos relacionales como origen principal de un modelo que reproduce un proceso de negocio, como pueden ser las ventas de una empresa, es encontrarnos con <strong>dos tablas de hechos con distinta granularidad para describir el mismo proceso<\/strong>. Una de ellas contendr\u00e1 un registro por cada ticket, albar\u00e1n o factura emitida con los atributos generales de fecha, cliente, base imponible, impuesto etc., y la otra ir\u00e1 un poco m\u00e1s all\u00e1 y registrar\u00e1 las ventas a nivel de cada producto vendido, es decir, existir\u00e1 un registro por cada l\u00ednea de detalle dentro de cada documento.<\/p>\n<p>En la siguiente imagen podemos ver un ejemplo de esta situaci\u00f3n, donde tanto los albaranes como las facturas presentan una estructura de datos del tipo descrito:<\/p>\n<p><!--more--><\/p>\n<p><a href=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-2-2.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-762 size-full\" src=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-2-2.png?resize=629%2C435&#038;ssl=1\" alt=\"\" width=\"629\" height=\"435\" srcset=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-2-2.png?w=843&amp;ssl=1 843w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-2-2.png?resize=300%2C207&amp;ssl=1 300w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-2-2.png?resize=768%2C531&amp;ssl=1 768w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/a><\/p>\n<p>Esta situaci\u00f3n es distinta a la que surge cuando tenemos una tabla por cada nivel dentro de una jerarqu\u00eda dimensional, como puede ser la jerarqu\u00eda natural que se forma cuando tenemos productos, familias de productos y secciones de productos. Aunque en este caso existen tambi\u00e9n varios niveles de datos, todos ellos corresponden a atributos dimensionales almacenados con distinta granularidad.<\/p>\n<p>En el caso que nos ocupa en este art\u00edculo, que podemos denominar como estructura cabecera\/detalle, <strong>ambas tablas forman una jerarqu\u00eda que modela los hechos de un mismo proceso de negocio, aunque su granularidad sea distinta<\/strong>. Podemos decir que este tipo de estructura surge cuando existe alg\u00fan tipo de relaci\u00f3n entre dos tablas de hechos.<\/p>\n<p>Como podemos ver en la imagen anterior, cada uno de los niveles de las tablas de hechos se relaciona directamente con alguna de las dimensiones del modelo, pero no con todas. Por ejemplo, <strong>si existe alguna m\u00e9trica en la cabecera<\/strong>, como puede ser un descuento o un coste log\u00edstico, no podr\u00eda segmentarse en funci\u00f3n de los atributos de la dimensi\u00f3n producto, al no estar directamente relacionadas ambas tablas. Este tipo de m\u00e9tricas corresponden con un documento de venta en su conjunto, pero no con cada una de las l\u00edneas que componen el mismo.<\/p>\n<h4>C\u00f3mo modelar correctamente esta situaci\u00f3n<\/h4>\n<p>Es posible pensar que mediante el uso de filtro cruzado entre ambas tablas de hechos podemos resolver esta situaci\u00f3n:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-1-1-1.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-767 size-full\" src=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-1-1-1.png?resize=629%2C301&#038;ssl=1\" alt=\"\" width=\"629\" height=\"301\" srcset=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-1-1-1.png?w=1103&amp;ssl=1 1103w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-1-1-1.png?resize=300%2C144&amp;ssl=1 300w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-1-1-1.png?resize=768%2C368&amp;ssl=1 768w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-1-1-1.png?resize=1024%2C490&amp;ssl=1 1024w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-1-1-1.png?resize=900%2C431&amp;ssl=1 900w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/a><\/p>\n<p>Tanto si habilitamos la direcci\u00f3n de filtro cruzado en Power BI como si utilizamos un patr\u00f3n en DAX de relaci\u00f3n varios-a-varios, si utilizamos un atributo de producto como segmentador, el modelo ser\u00e1 capaz de propagar el filtro tanto a la tabla que contiene la cabecera de las facturas como a la que contiene los detalles de cada una de ellas. Si creamos una visualizaci\u00f3n obtendremos un resultado que aparentemente computa los importes que nosotros buscamos, es decir, la suma de los importes descontados segmentados por cada uno de los art\u00edculos:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-3-2.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-766 size-full\" src=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-3-2.png?resize=206%2C257&#038;ssl=1\" alt=\"\" width=\"206\" height=\"257\"><\/a><\/p>\n<p>Aunque obtenemos un importe de descuento distinto para cada c\u00f3digo de art\u00edculo, <strong>este c\u00e1lculo es err\u00f3neo<\/strong>. Por cada producto, el filtro de contexto mantendr\u00e1 visibles todas las facturas que contienen dicho producto y sumar\u00e1 todos los descuentos aplicados a cada factura en su conjunto. Como podemos observar en la visualizaci\u00f3n anterior, solo al nivel del total general el c\u00e1lculo ser\u00e1 correcto, es decir, cuando no existe ning\u00fan filtro en los atributos de la dimensi\u00f3n Producto. <strong>No necesitamos los descuentos a nivel de detalle de cada producto, sino que los necesitamos al nivel de detalle de cada venta individual de producto.<\/strong><\/p>\n<p>Por lo tanto, cambiar el modelo de datos simplemente habilitando la propagaci\u00f3n de los filtros entre ambas tablas de hechos en las dos direcciones no nos proporciona el resultado buscado; que es reproducir un esquema en estrella, con una sola tabla de hechos que contenga toda la informaci\u00f3n relevante del proceso de negocio correspondiente y pueda filtrarse y segmentarte por cada uno de los atributos de cualquier dimensi\u00f3n.<\/p>\n<p>La forma de solucionar esta situaci\u00f3n es calcular el porcentaje de descuento que corresponde a cada una de las facturas, para posteriormente <strong>aplicar dicho porcentaje a cada una de las l\u00edneas de cada factura y desnormalizar completamente (aplanar) el resto de columnas de la cabecera en la tabla de detalles.<\/strong><\/p>\n<h4><\/h4>\n<h4>Utilizando DAX<\/h4>\n<p>Si no podemos modificar la estructura de las consultas que componen el modelo y tenemos que trabajar directamente con un modelo como el de las im\u00e1genes anteriores, podemos realizar este proceso utilizando el lenguaje DAX.<\/p>\n<p>Tanto para calcular el % que supone el descuento sobre la base imponible de cada factura y posteriormente aplicarlo a cada una de las l\u00edneas de detalle podemos usar el siguiente c\u00f3digo DAX gen\u00e9rico:<\/p>\n<p>SalesHeader[DiscountPct]&nbsp;=<br \/>\n<span class=\"Keyword\" style=\"color: #0070ff;\">DIVIDE<\/span><span class=\"Parenthesis\" style=\"color: #969696;\">&nbsp;(<\/span><br \/>\n<span class=\"indent4\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span>SalesHeader[TotalDiscount],<br \/>\n<span class=\"indent4\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span class=\"Keyword\" style=\"color: #0070ff;\">SUMX<\/span><span class=\"Parenthesis\" style=\"color: #969696;\">&nbsp;(<\/span><br \/>\n<span class=\"indent8\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span class=\"Keyword\" style=\"color: #0070ff;\">RELATEDTABLE<\/span><span class=\"Parenthesis\" style=\"color: #969696;\">&nbsp;(<\/span>&nbsp;SalesDetail&nbsp;<span class=\"Parenthesis\" style=\"color: #969696;\">)<\/span>,<br \/>\n<span class=\"indent8\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span>SalesDetail[Unit&nbsp;Price]&nbsp;<em>&nbsp;SalesDetail[Quantity]<br \/>\n<span class=\"indent4\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span class=\"Parenthesis\" style=\"color: #969696;\">)<\/span><br \/>\n<span class=\"Parenthesis\" style=\"color: #969696;\">)<\/span><br \/>\nSalesDetail[LineDiscount]&nbsp;=<br \/>\n<span class=\"Keyword\" style=\"color: #0070ff;\">RELATED<\/span><span class=\"Parenthesis\" style=\"color: #969696;\">&nbsp;(<\/span>&nbsp;SalesHeader[DiscountPct]&nbsp;<span class=\"Parenthesis\" style=\"color: #969696;\">)<\/span>&nbsp;<\/em>&nbsp;SalesDetail[Unit&nbsp;Price]&nbsp;*&nbsp;SalesDetail[Quantity]<\/p>\n<h4><\/h4>\n<h4>Utilizando M<\/h4>\n<p>Si podemos realizar transformaciones en las consultas de forma que apliquemos una <strong>optimizaci\u00f3n estructural de los datos antes de que estos sean cargados al modelo<\/strong>, podemos realizar los mismos pasos que hemos hecho en DAX desde el editor de consultas de Power BI, que en mi opini\u00f3n, es una soluci\u00f3n mucho m\u00e1s elegante.<\/p>\n<p>En primer lugar, obtenemos el descuento en t\u00e9rminos porcentuales respecto al total de la base imponible en la tabla Facturas con una columna calculada:<\/p>\n<p><a href=\"https:\/\/trainingpowerbi.files.wordpress.com\/2019\/03\/image-5.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-770 size-full\" src=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-5-2.png?resize=629%2C53&#038;ssl=1\" alt=\"\" width=\"629\" height=\"53\" srcset=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-5-2.png?w=739&amp;ssl=1 739w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-5-2.png?resize=300%2C25&amp;ssl=1 300w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/a><\/p>\n<p>Una vez obtenido dicho porcentaje, solo tenemos que combinar las dos consultas que registran el proceso de facturaci\u00f3n y expandir la columna de descuento en t\u00e9rminos porcentuales, as\u00ed como otras columnas que queramos trasladar hacia la tabla de l\u00edneas de facturas, que ser\u00e1, en el nuevo modelo, la <strong>\u00fanica tabla de hechos que registra el proceso de facturaci\u00f3n de la empresa<\/strong>:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-6-2.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-771 size-full\" src=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-6-2.png?resize=629%2C158&#038;ssl=1\" alt=\"\" width=\"629\" height=\"158\" srcset=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-6-2.png?w=1086&amp;ssl=1 1086w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-6-2.png?resize=300%2C75&amp;ssl=1 300w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-6-2.png?resize=768%2C192&amp;ssl=1 768w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-6-2.png?resize=1024%2C256&amp;ssl=1 1024w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-6-2.png?resize=900%2C225&amp;ssl=1 900w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/a><\/p>\n<p>Una vez hemos realizado este proceso, solo tendremos que cargar al modelo la tabla de detalles de factura:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-7-1.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-772 size-full\" src=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-7-1.png?resize=629%2C392&#038;ssl=1\" alt=\"\" width=\"629\" height=\"392\" srcset=\"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-7-1.png?w=856&amp;ssl=1 856w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-7-1.png?resize=300%2C187&amp;ssl=1 300w, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-7-1.png?resize=768%2C479&amp;ssl=1 768w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/a><\/p>\n<p>Si realizamos los mismos pasos con las consultas que registran los albaranes de la empresa, as\u00ed como con cualquier otras del mismo tipo, podremos recrear un modelo en estrella que nos ofrecer\u00e1 todas las ventajas de dicha estrucutra, entre las que se encuentra el aprovechar el hecho de que <strong>la mayor\u00eda de los motores anal\u00edticos (incluyendo el de Power BI y SQL Server Analysis Services) est\u00e1n altamente optimizados para manejar la informaci\u00f3n de este tipo de estructuras<\/strong>, con una tabla de hechos por cada proceso de negocio.<\/p>\n<blockquote><p><span style=\"color: #808080;\">Todo el c\u00f3digo DAX de este art\u00edculo ha sido formateado con<em> \u00abDAX Formatter\u00bb <\/em><\/span><br \/>\n<a href=\"http:\/\/www.daxformatter.com?utm_source=badge-dark&amp;utm_medium=ad&amp;utm_campaign=embed\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.daxformatter.com\/wp-content\/themes\/daxformatter\/images\/daxformatter-badge-small-dark.png?w=629\" alt=\"DAX Formatter by SQLBI\"><\/a><\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n Un escenario muy frecuente cuando utilizamos bases de datos relacionales como origen principal de un modelo que reproduce un proceso de negocio, como pueden ser las ventas de una empresa, es encontrarnos con dos tablas de hechos con distinta granularidad para describir el mismo proceso. Una de ellas contendr\u00e1 un registro por cada ticket, [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[2,4,6],"tags":[9,10,29,11,12,31,14,23,18],"post_series":[],"class_list":["post-760","post","type-post","status-publish","format-standard","hentry","category-arquitectura-de-datos","category-dax-power-pivot","category-m-power-query","tag-dax","tag-editor-de-consultas","tag-etl","tag-inteligencia-de-negocios","tag-m","tag-modelado-de-datos","tag-power-bi","tag-power-pivot","tag-power-query"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Introducci\u00f3n Un escenario muy frecuente cuando utilizamos bases de datos relacionales como origen principal de un modelo que reproduce un proceso de negocio, como pueden ser las ventas de una empresa, es encontrarnos con dos tablas de hechos con distinta granularidad para describir el mismo proceso. Una de ellas contendr\u00e1 un registro por cada ticket,\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Admin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/bicontrolling.com\/index.php\/2018\/12\/13\/header-detail\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Business Intelligence Controlling | La nueva generaci\u00f3n del reporting econ\u00f3mico-financiero y el control de gesti\u00f3n empresarial\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Estructuras jer\u00e1rquicas en tablas de hechos | Business Intelligence Controlling\" \/>\n\t\t<meta property=\"og:description\" content=\"Introducci\u00f3n Un escenario muy frecuente cuando utilizamos bases de datos relacionales como origen principal de un modelo que reproduce un proceso de negocio, como pueden ser las ventas de una empresa, es encontrarnos con dos tablas de hechos con distinta granularidad para describir el mismo proceso. Una de ellas contendr\u00e1 un registro por cada ticket,\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/bicontrolling.com\/index.php\/2018\/12\/13\/header-detail\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2018-12-13T15:17:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-04T11:12:42+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Estructuras jer\u00e1rquicas en tablas de hechos | Business Intelligence Controlling\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Introducci\u00f3n Un escenario muy frecuente cuando utilizamos bases de datos relacionales como origen principal de un modelo que reproduce un proceso de negocio, como pueden ser las ventas de una empresa, es encontrarnos con dos tablas de hechos con distinta granularidad para describir el mismo proceso. Una de ellas contendr\u00e1 un registro por cada ticket,\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2018\\\/12\\\/13\\\/header-detail\\\/#article\",\"name\":\"Estructuras jer\\u00e1rquicas en tablas de hechos | Business Intelligence Controlling\",\"headline\":\"Estructuras jer\\u00e1rquicas en tablas de hechos\",\"author\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/bicontrolling.com\\\/wp-content\\\/uploads\\\/2019\\\/03\\\/image-2-2.png?fit=843%2C583&ssl=1\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2018\\\/12\\\/13\\\/header-detail\\\/#articleImage\",\"width\":843,\"height\":583},\"datePublished\":\"2018-12-13T16:17:00+01:00\",\"dateModified\":\"2020-05-04T13:12:42+02:00\",\"inLanguage\":\"es-ES\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2018\\\/12\\\/13\\\/header-detail\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2018\\\/12\\\/13\\\/header-detail\\\/#webpage\"},\"articleSection\":\"Arquitectura de datos, DAX, M (Power Query), DAX, Editor de consultas, ETL, Inteligencia de negocios, M, Modelado de datos, Power BI, Power Pivot, Power Query\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2018\\\/12\\\/13\\\/header-detail\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com#listItem\",\"position\":1,\"name\":\"Inicio\",\"item\":\"https:\\\/\\\/bicontrolling.com\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/category\\\/arquitectura-de-datos\\\/#listItem\",\"name\":\"Arquitectura de datos\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/category\\\/arquitectura-de-datos\\\/#listItem\",\"position\":2,\"name\":\"Arquitectura de datos\",\"item\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/category\\\/arquitectura-de-datos\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2018\\\/12\\\/13\\\/header-detail\\\/#listItem\",\"name\":\"Estructuras jer\\u00e1rquicas en tablas de hechos\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com#listItem\",\"name\":\"Inicio\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2018\\\/12\\\/13\\\/header-detail\\\/#listItem\",\"position\":3,\"name\":\"Estructuras jer\\u00e1rquicas en tablas de hechos\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/category\\\/arquitectura-de-datos\\\/#listItem\",\"name\":\"Arquitectura de datos\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#organization\",\"name\":\"Business Intelligence Controlling\",\"description\":\"La nueva generaci\\u00f3n del reporting econ\\u00f3mico-financiero y el control de gesti\\u00f3n empresarial\",\"url\":\"https:\\\/\\\/bicontrolling.com\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/admin\\\/\",\"name\":\"Admin\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2018\\\/12\\\/13\\\/header-detail\\\/#webpage\",\"url\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2018\\\/12\\\/13\\\/header-detail\\\/\",\"name\":\"Estructuras jer\\u00e1rquicas en tablas de hechos | Business Intelligence Controlling\",\"description\":\"Introducci\\u00f3n Un escenario muy frecuente cuando utilizamos bases de datos relacionales como origen principal de un modelo que reproduce un proceso de negocio, como pueden ser las ventas de una empresa, es encontrarnos con dos tablas de hechos con distinta granularidad para describir el mismo proceso. Una de ellas contendr\\u00e1 un registro por cada ticket,\",\"inLanguage\":\"es-ES\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/2018\\\/12\\\/13\\\/header-detail\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/index.php\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2018-12-13T16:17:00+01:00\",\"dateModified\":\"2020-05-04T13:12:42+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#website\",\"url\":\"https:\\\/\\\/bicontrolling.com\\\/\",\"name\":\"Business Intelligence Controlling\",\"description\":\"La nueva generaci\\u00f3n del reporting econ\\u00f3mico-financiero y el control de gesti\\u00f3n empresarial\",\"inLanguage\":\"es-ES\",\"publisher\":{\"@id\":\"https:\\\/\\\/bicontrolling.com\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Estructuras jer\u00e1rquicas en tablas de hechos | Business Intelligence Controlling","description":"Introducci\u00f3n Un escenario muy frecuente cuando utilizamos bases de datos relacionales como origen principal de un modelo que reproduce un proceso de negocio, como pueden ser las ventas de una empresa, es encontrarnos con dos tablas de hechos con distinta granularidad para describir el mismo proceso. Una de ellas contendr\u00e1 un registro por cada ticket,","canonical_url":"https:\/\/bicontrolling.com\/index.php\/2018\/12\/13\/header-detail\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/bicontrolling.com\/index.php\/2018\/12\/13\/header-detail\/#article","name":"Estructuras jer\u00e1rquicas en tablas de hechos | Business Intelligence Controlling","headline":"Estructuras jer\u00e1rquicas en tablas de hechos","author":{"@id":"https:\/\/bicontrolling.com\/index.php\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/bicontrolling.com\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2019\/03\/image-2-2.png?fit=843%2C583&ssl=1","@id":"https:\/\/bicontrolling.com\/index.php\/2018\/12\/13\/header-detail\/#articleImage","width":843,"height":583},"datePublished":"2018-12-13T16:17:00+01:00","dateModified":"2020-05-04T13:12:42+02:00","inLanguage":"es-ES","mainEntityOfPage":{"@id":"https:\/\/bicontrolling.com\/index.php\/2018\/12\/13\/header-detail\/#webpage"},"isPartOf":{"@id":"https:\/\/bicontrolling.com\/index.php\/2018\/12\/13\/header-detail\/#webpage"},"articleSection":"Arquitectura de datos, DAX, M (Power Query), DAX, Editor de consultas, ETL, Inteligencia de negocios, M, Modelado de datos, Power BI, Power Pivot, Power Query"},{"@type":"BreadcrumbList","@id":"https:\/\/bicontrolling.com\/index.php\/2018\/12\/13\/header-detail\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/bicontrolling.com#listItem","position":1,"name":"Inicio","item":"https:\/\/bicontrolling.com","nextItem":{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/#listItem","name":"Arquitectura de datos"}},{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/#listItem","position":2,"name":"Arquitectura de datos","item":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/","nextItem":{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/2018\/12\/13\/header-detail\/#listItem","name":"Estructuras jer\u00e1rquicas en tablas de hechos"},"previousItem":{"@type":"ListItem","@id":"https:\/\/bicontrolling.com#listItem","name":"Inicio"}},{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/2018\/12\/13\/header-detail\/#listItem","position":3,"name":"Estructuras jer\u00e1rquicas en tablas de hechos","previousItem":{"@type":"ListItem","@id":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/#listItem","name":"Arquitectura de datos"}}]},{"@type":"Organization","@id":"https:\/\/bicontrolling.com\/#organization","name":"Business Intelligence Controlling","description":"La nueva generaci\u00f3n del reporting econ\u00f3mico-financiero y el control de gesti\u00f3n empresarial","url":"https:\/\/bicontrolling.com\/"},{"@type":"Person","@id":"https:\/\/bicontrolling.com\/index.php\/author\/admin\/#author","url":"https:\/\/bicontrolling.com\/index.php\/author\/admin\/","name":"Admin"},{"@type":"WebPage","@id":"https:\/\/bicontrolling.com\/index.php\/2018\/12\/13\/header-detail\/#webpage","url":"https:\/\/bicontrolling.com\/index.php\/2018\/12\/13\/header-detail\/","name":"Estructuras jer\u00e1rquicas en tablas de hechos | Business Intelligence Controlling","description":"Introducci\u00f3n Un escenario muy frecuente cuando utilizamos bases de datos relacionales como origen principal de un modelo que reproduce un proceso de negocio, como pueden ser las ventas de una empresa, es encontrarnos con dos tablas de hechos con distinta granularidad para describir el mismo proceso. Una de ellas contendr\u00e1 un registro por cada ticket,","inLanguage":"es-ES","isPartOf":{"@id":"https:\/\/bicontrolling.com\/#website"},"breadcrumb":{"@id":"https:\/\/bicontrolling.com\/index.php\/2018\/12\/13\/header-detail\/#breadcrumblist"},"author":{"@id":"https:\/\/bicontrolling.com\/index.php\/author\/admin\/#author"},"creator":{"@id":"https:\/\/bicontrolling.com\/index.php\/author\/admin\/#author"},"datePublished":"2018-12-13T16:17:00+01:00","dateModified":"2020-05-04T13:12:42+02:00"},{"@type":"WebSite","@id":"https:\/\/bicontrolling.com\/#website","url":"https:\/\/bicontrolling.com\/","name":"Business Intelligence Controlling","description":"La nueva generaci\u00f3n del reporting econ\u00f3mico-financiero y el control de gesti\u00f3n empresarial","inLanguage":"es-ES","publisher":{"@id":"https:\/\/bicontrolling.com\/#organization"}}]},"og:locale":"es_ES","og:site_name":"Business Intelligence Controlling | La nueva generaci\u00f3n del reporting econ\u00f3mico-financiero y el control de gesti\u00f3n empresarial","og:type":"article","og:title":"Estructuras jer\u00e1rquicas en tablas de hechos | Business Intelligence Controlling","og:description":"Introducci\u00f3n Un escenario muy frecuente cuando utilizamos bases de datos relacionales como origen principal de un modelo que reproduce un proceso de negocio, como pueden ser las ventas de una empresa, es encontrarnos con dos tablas de hechos con distinta granularidad para describir el mismo proceso. Una de ellas contendr\u00e1 un registro por cada ticket,","og:url":"https:\/\/bicontrolling.com\/index.php\/2018\/12\/13\/header-detail\/","article:published_time":"2018-12-13T15:17:00+00:00","article:modified_time":"2020-05-04T11:12:42+00:00","twitter:card":"summary","twitter:title":"Estructuras jer\u00e1rquicas en tablas de hechos | Business Intelligence Controlling","twitter:description":"Introducci\u00f3n Un escenario muy frecuente cuando utilizamos bases de datos relacionales como origen principal de un modelo que reproduce un proceso de negocio, como pueden ser las ventas de una empresa, es encontrarnos con dos tablas de hechos con distinta granularidad para describir el mismo proceso. Una de ellas contendr\u00e1 un registro por cada ticket,"},"aioseo_meta_data":{"post_id":"760","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-03-31 11:39:56","updated":"2025-06-04 11:51:54","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/bicontrolling.com\" title=\"Inicio\">Inicio<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/\" title=\"Arquitectura de datos\">Arquitectura de datos<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tEstructuras jer\u00e1rquicas en tablas de hechos\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Inicio","link":"https:\/\/bicontrolling.com"},{"label":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},{"label":"Estructuras jer\u00e1rquicas en tablas de hechos","link":"https:\/\/bicontrolling.com\/index.php\/2018\/12\/13\/header-detail\/"}],"jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":1568,"url":"https:\/\/bicontrolling.com\/index.php\/2020\/04\/19\/mostrar-la-ultima-fecha-de-actualizacion-en-power-bi\/","url_meta":{"origin":760,"position":0},"title":"Mostrar la \u00faltima fecha de actualizaci\u00f3n en Power BI","author":"Admin","date":"19 abril, 2020","format":false,"excerpt":"Introducci\u00f3n En numerosas ocasiones, la primera pregunta que nos hace un usuario de un informe en Power BI es \u00bfest\u00e1n los datos actualizados? En un Panel del Servicio podemos configurar en cualquiera de las visualizaciones ancladas en el mismo, la capacidad de mostrar la hora de \u00faltima actualizaci\u00f3n de los\u2026","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2020\/04\/Imagen-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2020\/04\/Imagen-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2020\/04\/Imagen-1.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":464,"url":"https:\/\/bicontrolling.com\/index.php\/2017\/12\/10\/tablas-de-medidas-en-power-bi-desktop\/","url_meta":{"origin":760,"position":1},"title":"Grupos de medidas en Power BI Desktop","author":"Admin","date":"10 diciembre, 2017","format":false,"excerpt":"En numerosas ocasiones, cuando estamos trabajando con modelos de datos complejos, con muchas tablas y relaciones, y que requieren un n\u00famero considerable de medidas, es importante tener en cuenta el lugar de almacenamiento de las mismas. Por ejemplo, es probable que tras cargar al modelo de datos todas las consultas\u2026","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/04\/image-9-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/04\/image-9-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/04\/image-9-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/04\/image-9-1.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2018\/04\/image-9-1.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":2059,"url":"https:\/\/bicontrolling.com\/index.php\/2023\/08\/31\/integridad-referencial-y-miembros-de\/","url_meta":{"origin":760,"position":2},"title":"Integridad referencial y miembros desconocidos en Power BI","author":"Admin","date":"31 agosto, 2023","format":false,"excerpt":"Introducci\u00f3n En este art\u00edculo vamos a explorar como se comporta Power BI cuando en un modelo de datos existen violaciones de la integridad referencial, y como podemos identificar y solventar este problema, a la vez que agrupamos los miembros desconocidos dot\u00e1ndolos de significado y garantizando la integridad de nuestro modelo.\u2026","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2023\/08\/image-1.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":1828,"url":"https:\/\/bicontrolling.com\/index.php\/2021\/03\/06\/gppb2021-madrid-integracion-de-previsiones-y-presupuestos-en-el-modelo-tabular-video\/","url_meta":{"origin":760,"position":3},"title":"GPPB2021 Madrid &#8211; Integraci\u00f3n de previsiones y presupuestos en el modelo tabular (video)","author":"Admin","date":"6 marzo, 2021","format":false,"excerpt":"Ya est\u00e1n disponibles las grabaciones del Global Power Platform Bootcamp de Madrid. Os comparto el video de mi sesi\u00f3n donde estuvimos analizando las diferentes opciones que tenemos para integrar previsiones y presupuestos en un modelo de datos de Power BI. Vimos c\u00f3mo crear relaciones virtuales con DAX, c\u00f3mo inspeccionar el\u2026","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/img.youtube.com\/vi\/_wGEZZGP_nI\/0.jpg?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":1938,"url":"https:\/\/bicontrolling.com\/index.php\/2021\/11\/26\/hasta-el-ultimo-segundo-en-power-bi\/","url_meta":{"origin":760,"position":4},"title":"Hasta el \u00faltimo segundo en Power BI","author":"Admin","date":"26 noviembre, 2021","format":false,"excerpt":"Video de mi participaci\u00f3n en Power Platform Madrid, con una sesi\u00f3n sobre la creaci\u00f3n y el uso de una dimensi\u00f3n horaria que nos permita analizar nuestros hechos a granularidades inferiores al d\u00eda. https:\/\/www.youtube.com\/watch?v=UViZ3lzLxrE","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/img.youtube.com\/vi\/UViZ3lzLxrE\/0.jpg?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2111,"url":"https:\/\/bicontrolling.com\/index.php\/2023\/10\/26\/trabajando-con-tablas-desde-hasta-o-de-rango-de-fechas\/","url_meta":{"origin":760,"position":5},"title":"Trabajando con tablas &#8216;desde-hasta&#8217; o de rango de fechas en Power BI","author":"Admin","date":"26 octubre, 2023","format":false,"excerpt":"Introducci\u00f3n Uno de los tipos de tabla que nos encontramos frecuentemente a la hora de crear un modelo de datos anal\u00edtico corresponde a las tablas \"desde-hasta\" o de intervalo de fechas. Estas son un tipo de estructura muy vers\u00e1til que utilizan las bases de datos para representar y gestionar informaci\u00f3n\u2026","rel":"","context":"En \u00abArquitectura de datos\u00bb","block_context":{"text":"Arquitectura de datos","link":"https:\/\/bicontrolling.com\/index.php\/category\/arquitectura-de-datos\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2023\/08\/image-5.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2023\/08\/image-5.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2023\/08\/image-5.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/bicontrolling.com\/wp-content\/uploads\/2023\/08\/image-5.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/posts\/760","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/comments?post=760"}],"version-history":[{"count":5,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/posts\/760\/revisions"}],"predecessor-version":[{"id":1631,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/posts\/760\/revisions\/1631"}],"wp:attachment":[{"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/media?parent=760"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/categories?post=760"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/tags?post=760"},{"taxonomy":"post_series","embeddable":true,"href":"https:\/\/bicontrolling.com\/index.php\/wp-json\/wp\/v2\/post_series?post=760"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}