[{"data":1,"prerenderedAt":590},["ShallowReactive",2],{"navigation_docs_en":3,"-en-using-configuration-architecture-marts-reporting":241,"-en-using-configuration-architecture-marts-reporting-surround":587},[4,17,42,206,232],{"title":5,"redirect":6,"path":7,"stem":8,"children":9,"page":16},"Introduction","\u002Fen\u002Fintroduction\u002Fintroduction","\u002Fen\u002Fintroduction","en\u002F1.introduction",[10,12],{"title":5,"path":6,"stem":11},"en\u002F1.introduction\u002F1.introduction",{"title":13,"path":14,"stem":15},"Prerequisites","\u002Fen\u002Fintroduction\u002Fprerequisites","en\u002F1.introduction\u002F2.prerequisites",false,{"title":18,"redirect":19,"path":20,"stem":21,"children":22,"page":16},"Installation","\u002Fen\u002Finstallation\u002Fsetup","\u002Fen\u002Finstallation","en\u002F2.installation",[23,26,30,34,38],{"title":24,"path":19,"stem":25},"Machine set-up","en\u002F2.installation\u002F1.setup",{"title":27,"path":28,"stem":29},"A Tale of Two Repos","\u002Fen\u002Finstallation\u002Ftale-repos","en\u002F2.installation\u002F2.tale-repos",{"title":31,"path":32,"stem":33},"Database connection","\u002Fen\u002Finstallation\u002Fdbt-profile","en\u002F2.installation\u002F3.dbt-profile",{"title":35,"path":36,"stem":37},"Smoke-testing","\u002Fen\u002Finstallation\u002Fsmoke-testing","en\u002F2.installation\u002F4.smoke-testing",{"title":39,"path":40,"stem":41},"What now ?","\u002Fen\u002Finstallation\u002Fwhat-now","en\u002F2.installation\u002F5.what-now",{"title":43,"path":44,"stem":45,"children":46,"page":16},"Users Guide","\u002Fen\u002Fusing","en\u002F3.using",[47,50,54,88,188,202],{"title":5,"path":48,"stem":49},"\u002Fen\u002Fusing\u002Fintroduction","en\u002F3.using\u002F1.introduction",{"title":51,"path":52,"stem":53},"Running the ETL","\u002Fen\u002Fusing\u002Frunning","en\u002F3.using\u002F2.running",{"title":55,"path":56,"stem":57,"children":58,"page":16},"Configuration","\u002Fen\u002Fusing\u002Fconfiguration","en\u002F3.using\u002F3.configuration",[59,72,76,80,84],{"title":60,"path":61,"stem":62,"children":63,"page":16},"Architecture","\u002Fen\u002Fusing\u002Fconfiguration\u002Farchitecture","en\u002F3.using\u002F3.configuration\u002F1.architecture",[64,68],{"title":65,"path":66,"stem":67},"Overview","\u002Fen\u002Fusing\u002Fconfiguration\u002Farchitecture\u002Foverview","en\u002F3.using\u002F3.configuration\u002F1.architecture\u002F1.overview",{"title":69,"path":70,"stem":71},"Marts and reporting layer","\u002Fen\u002Fusing\u002Fconfiguration\u002Farchitecture\u002Fmarts-reporting","en\u002F3.using\u002F3.configuration\u002F1.architecture\u002F2.marts-reporting",{"title":73,"path":74,"stem":75},"Linking the databases","\u002Fen\u002Fusing\u002Fconfiguration\u002Fdatabases","en\u002F3.using\u002F3.configuration\u002F2.databases",{"title":77,"path":78,"stem":79},"Adapters and seeds","\u002Fen\u002Fusing\u002Fconfiguration\u002Fadapts-seeds","en\u002F3.using\u002F3.configuration\u002F3.adapts-seeds",{"title":81,"path":82,"stem":83},"Enabling a resource","\u002Fen\u002Fusing\u002Fconfiguration\u002Fenabling","en\u002F3.using\u002F3.configuration\u002F4.enabling",{"title":85,"path":86,"stem":87},"Overriding","\u002Fen\u002Fusing\u002Fconfiguration\u002Foverriding","en\u002F3.using\u002F3.configuration\u002F5.overriding",{"title":89,"redirect":90,"path":91,"stem":92,"children":93,"page":16},"Dashboards","\u002Fen\u002Fusing\u002F","\u002Fen\u002Fusing\u002Fdashboards","en\u002F3.using\u002F4.dashboards",[94,97,126,167,176,184],{"title":5,"path":95,"stem":96},"\u002Fen\u002Fusing\u002Fdashboards\u002Fintroduction","en\u002F3.using\u002F4.dashboards\u002F1.introduction",{"title":98,"redirect":99,"path":99,"stem":100,"children":101,"page":16},"Human resources","\u002Fen\u002Fusing\u002Fdashboards\u002Fhr","en\u002F3.using\u002F4.dashboards\u002F2. hr",[102,106,110,114,118,122],{"title":103,"path":104,"stem":105},"Employees leaves","\u002Fen\u002Fusing\u002Fdashboards\u002Fhr\u002Femp_conge","en\u002F3.using\u002F4.dashboards\u002F2. hr\u002F1.emp_conge",{"title":107,"path":108,"stem":109},"Active employees","\u002Fen\u002Fusing\u002Fdashboards\u002Fhr\u002Fempl_actif","en\u002F3.using\u002F4.dashboards\u002F2. hr\u002F2.empl_actif",{"title":111,"path":112,"stem":113},"Retirement","\u002Fen\u002Fusing\u002Fdashboards\u002Fhr\u002Fretirement","en\u002F3.using\u002F4.dashboards\u002F2. hr\u002F3.retirement",{"title":115,"path":116,"stem":117},"Efficacité","\u002Fen\u002Fusing\u002Fdashboards\u002Fhr\u002Fefficacite","en\u002F3.using\u002F4.dashboards\u002F2. hr\u002F4.efficacite",{"title":119,"path":120,"stem":121},"Absences des employé(e)s","\u002Fen\u002Fusing\u002Fdashboards\u002Fhr\u002Femp_abs","en\u002F3.using\u002F4.dashboards\u002F2. hr\u002F5.emp_abs",{"title":123,"path":124,"stem":125},"Resignation","\u002Fen\u002Fusing\u002Fdashboards\u002Fhr\u002Fresignation","en\u002F3.using\u002F4.dashboards\u002F2. hr\u002F6.resignation",{"title":127,"redirect":128,"path":128,"stem":129,"children":130,"page":16},"Educational service","\u002Fen\u002Fusing\u002Fdashboards\u002Feduc-serv","en\u002F3.using\u002F4.dashboards\u002F3.educ-serv",[131,135,139,143,147,151,155,159,163],{"title":132,"path":133,"stem":134},"Res epreuves","\u002Fen\u002Fusing\u002Fdashboards\u002Feduc-serv\u002Fres_epreuves","en\u002F3.using\u002F4.dashboards\u002F3.educ-serv\u002F1.res_epreuves",{"title":136,"path":137,"stem":138},"Students results monitoring","\u002Fen\u002Fusing\u002Fdashboards\u002Feduc-serv\u002Fsuivi_resultats","en\u002F3.using\u002F4.dashboards\u002F3.educ-serv\u002F2.suivi_resultats",{"title":140,"path":141,"stem":142},"Students headcount","\u002Fen\u002Fusing\u002Fdashboards\u002Feduc-serv\u002Feffectif_css","en\u002F3.using\u002F4.dashboards\u002F3.educ-serv\u002F3.effectif_css",{"title":144,"path":145,"stem":146},"Students absenteeism","\u002Fen\u002Fusing\u002Fdashboards\u002Feduc-serv\u002Fchronic_absenteeism","en\u002F3.using\u002F4.dashboards\u002F3.educ-serv\u002F4.chronic_absenteeism",{"title":148,"path":149,"stem":150},"Academic results","\u002Fen\u002Fusing\u002Fdashboards\u002Feduc-serv\u002Fres_scolaires","en\u002F3.using\u002F4.dashboards\u002F3.educ-serv\u002F5.res_scolaires",{"title":152,"path":153,"stem":154},"Predictive modelling - aggregated","\u002Fen\u002Fusing\u002Fdashboards\u002Feduc-serv\u002Fpredictive-aggregated","en\u002F3.using\u002F4.dashboards\u002F3.educ-serv\u002F6.predictive-aggregated",{"title":156,"path":157,"stem":158},"PEVR","\u002Fen\u002Fusing\u002Fdashboards\u002Feduc-serv\u002Fpevr","en\u002F3.using\u002F4.dashboards\u002F3.educ-serv\u002F7.pevr",{"title":160,"path":161,"stem":162},"Absenteeism","\u002Fen\u002Fusing\u002Fdashboards\u002Feduc-serv\u002Fabsenteeism","en\u002F3.using\u002F4.dashboards\u002F3.educ-serv\u002F8.absenteeism",{"title":164,"path":165,"stem":166},"Diplôme","\u002Fen\u002Fusing\u002Fdashboards\u002Feduc-serv\u002Fdiplome","en\u002F3.using\u002F4.dashboards\u002F3.educ-serv\u002F9.diplome",{"title":168,"redirect":169,"path":169,"stem":170,"children":171,"page":16},"School organisation","\u002Fen\u002Fusing\u002Fdashboards\u002Fschool-org","en\u002F3.using\u002F4.dashboards\u002F4.school-org",[172],{"title":173,"path":174,"stem":175},"Anomalies","\u002Fen\u002Fusing\u002Fdashboards\u002Fschool-org\u002Fanomalies","en\u002F3.using\u002F4.dashboards\u002F4.school-org\u002F1.anomalies",{"title":177,"path":178,"stem":179,"children":180,"page":16},"DirectionGenerale","\u002Fen\u002Fusing\u002Fdashboards\u002Fdirection_generale","en\u002F3.using\u002F4.dashboards\u002F5.direction_generale",[181],{"title":156,"path":182,"stem":183},"\u002Fen\u002Fusing\u002Fdashboards\u002Fdirection_generale\u002Fpevr","en\u002F3.using\u002F4.dashboards\u002F5.direction_generale\u002F1.pevr",{"title":185,"path":186,"stem":187},"Row Level Security","\u002Fen\u002Fusing\u002Fdashboards\u002Frls","en\u002F3.using\u002F4.dashboards\u002F5.rls",{"title":189,"redirect":90,"path":190,"stem":191,"children":192,"page":16},"Data marts","\u002Fen\u002Fusing\u002Fmarts","en\u002F3.using\u002F6.marts",[193,196,199],{"title":5,"path":194,"stem":195},"\u002Fen\u002Fusing\u002Fmarts\u002Fmarts","en\u002F3.using\u002F6.marts\u002F1.marts",{"title":127,"path":197,"stem":198},"\u002Fen\u002Fusing\u002Fmarts\u002Feducational-service","en\u002F3.using\u002F6.marts\u002F2.educational-service",{"title":98,"path":200,"stem":201},"\u002Fen\u002Fusing\u002Fmarts\u002Fhuman-resources","en\u002F3.using\u002F6.marts\u002F3.human-resources",{"title":203,"path":204,"stem":205},"Production checklist","\u002Fen\u002Fusing\u002Fproduction","en\u002F3.using\u002F7.production",{"title":207,"redirect":208,"path":209,"stem":210,"children":211,"page":16},"Developers Guide","\u002Fen\u002Fcontributing\u002Fgetting-started","\u002Fen\u002Fcontributing","en\u002F4.contributing",[212,215,223],{"title":213,"path":208,"stem":214},"Getting Started","en\u002F4.contributing\u002F1.getting-started",{"title":216,"redirect":217,"path":218,"stem":219,"children":220,"page":16},"Conventions","\u002Fen\u002Fcontributing\u002Fconventions\u002Fgetting-started","\u002Fen\u002Fcontributing\u002Fconventions","en\u002F4.contributing\u002F2.conventions",[221],{"title":213,"path":217,"stem":222},"en\u002F4.contributing\u002F2.conventions\u002F1.getting-started",{"title":224,"path":225,"stem":226,"children":227,"page":16},"Docs Ref","\u002Fen\u002Fcontributing\u002Fdocs","en\u002F4.contributing\u002F99.docs",[228],{"title":229,"path":230,"stem":231},"Components","\u002Fen\u002Fcontributing\u002Fdocs\u002Fcomponents","en\u002F4.contributing\u002F99.docs\u002F1.components",{"title":233,"redirect":6,"path":234,"stem":235,"children":236,"page":16},"Migrations","\u002Fen\u002Fmigrations","en\u002F5.migrations",[237],{"title":238,"path":239,"stem":240},"V0.17 -> V0.18","\u002Fen\u002Fmigrations\u002Fv0.17_to_v0.18","en\u002F5.migrations\u002F1.v0.17_to_v0.18",{"id":242,"title":69,"body":243,"description":253,"extension":581,"links":582,"meta":583,"navigation":584,"path":70,"seo":585,"stem":71,"__hash__":586},"docs_en\u002Fen\u002F3.using\u002F3.configuration\u002F1.architecture\u002F2.marts-reporting.md",{"type":244,"value":245,"toc":569},"minimark",[246,250,254,257,268,271,276,279,282,285,291,294,300,303,309,312,316,319,322,325,331,334,340,343,347,447,451,454,457,463,466,470,473,476,482,485,489,492,498,501,504,510,514,517,519,525,528,531,535,538,544,547,550,556,560,563],[247,248,69],"h1",{"id":249},"marts-and-reporting-layer",[251,252,253],"p",{},"The Store does not ask Power BI to be the analytical warehouse.",[251,255,256],{},"The separation is:",[258,259,265],"pre",{"className":260,"code":262,"language":263,"meta":264},[261],"language-text","Marts\n  = governed analytical truth\n\nReporting layer\n  = serving tables for Power BI\n","text","",[266,267,262],"code",{"__ignoreMap":264},[251,269,270],{},"Both layers can be built in SQL\u002Fdbt, but they do not have the same role.",[272,273,275],"h2",{"id":274},"marts-analytical-truth","Marts: analytical truth",[251,277,278],{},"A mart is the layer where business concepts are stabilized.",[251,280,281],{},"It defines information once, with a clear grain, stable keys, and reusable dimensions. A mart table should be able to serve several use cases, pages, or dashboards.",[251,283,284],{},"A mart typically contains:",[258,286,289],{"className":287,"code":288,"language":263,"meta":264},[261],"facts at an explicit grain\nconformed dimensions\nstable keys\nclean business definitions\ncontrolled historization\nreusable indicators\n",[266,290,288],{"__ignoreMap":264},[251,292,293],{},"Examples:",[258,295,298],{"className":296,"code":297,"language":263,"meta":264},[261],"fact_resultats_examens\ndim_ecole\ndim_date\ndim_eleve\ndim_matiere\n\nfact_absences_personnel\ndim_ecole\ndim_date\ndim_personnel\ndim_corps_emploi\n\nfact_sondages\ndim_ecole\ndim_campagne\ndim_theme\ndim_population\n",[266,299,297],{"__ignoreMap":264},[251,301,302],{},"A mart answers questions such as:",[258,304,307],{"className":305,"code":306,"language":263,"meta":264},[261],"What is the official grain of this data?\nWhich school dimension should be used?\nHow is an absence defined?\nWhat is the stable definition of the success rate?\nShould this metric be reusable by several reports?\n",[266,308,306],{"__ignoreMap":264},[251,310,311],{},"A mart should not contain a table only because it is convenient for one Power BI page. It should carry definitions that deserve to be governed.",[272,313,315],{"id":314},"reporting-the-power-bi-serving-layer","Reporting: the Power BI serving layer",[251,317,318],{},"The reporting layer prepares final tables consumed by dashboards.",[251,320,321],{},"It can be intentionally denormalized. A reporting table can repeat labels, embed thresholds, precompute variations, and expose directly the columns required by a Power BI page.",[251,323,324],{},"It typically contains:",[258,326,329],{"className":327,"code":328,"language":263,"meta":264},[261],"wide tables\none-big-tables\npre-aggregated outputs\ncalculated values\nvariations\nstatuses\nlabels\nthresholds\nranks\nscores\ncomposite indicators\nsort or display columns\n",[266,330,328],{"__ignoreMap":264},[251,332,333],{},"The reporting layer answers questions such as:",[258,335,338],{"className":336,"code":337,"language":263,"meta":264},[261],"Which columns does this Power BI page need?\nWhich calculations must be ready before the report opens?\nWhich labels, statuses, or thresholds must be displayed?\nWhich table makes the Power BI model simpler?\n",[266,339,337],{"__ignoreMap":264},[251,341,342],{},"The goal is not to do pure Kimball inside Power BI. The goal is to give Power BI tables that are easy to use, precomputed, and stable from the report's point of view.",[272,344,346],{"id":345},"difference-between-both-layers","Difference between both layers",[348,349,350,366],"table",{},[351,352,353],"thead",{},[354,355,356,360,363],"tr",{},[357,358,359],"th",{},"Question",[357,361,362],{},"Mart",[357,364,365],{},"Reporting",[367,368,369,381,392,403,414,425,436],"tbody",{},[354,370,371,375,378],{},[372,373,374],"td",{},"Role",[372,376,377],{},"Govern analytical truth.",[372,379,380],{},"Serve one or several Power BI reports.",[354,382,383,386,389],{},[372,384,385],{},"Model",[372,387,388],{},"Kimball: facts, dimensions, explicit grain.",[372,390,391],{},"OBT, wide tables, pre-aggregated outputs.",[354,393,394,397,400],{},[372,395,396],{},"Reuse",[372,398,399],{},"Designed for several use cases.",[372,401,402],{},"Designed for presentation needs.",[354,404,405,408,411],{},[372,406,407],{},"Grain",[372,409,410],{},"Strict and documented.",[372,412,413],{},"Adapted to the visual or report need.",[354,415,416,419,422],{},[372,417,418],{},"Calculations",[372,420,421],{},"Canonical business definitions.",[372,423,424],{},"Presentation calculations, statuses, variations, thresholds.",[354,426,427,430,433],{},[372,428,429],{},"Consumer",[372,431,432],{},"Other dbt models, other dashboards, analyses.",[372,434,435],{},"Power BI.",[354,437,438,441,444],{},[372,439,440],{},"Risk to avoid",[372,442,443],{},"Too much local logic or presentation columns.",[372,445,446],{},"Becoming a second business truth.",[272,448,450],{"id":449},"kimball-and-obt-are-not-opposed-here","Kimball and OBT are not opposed here",[251,452,453],{},"In this architecture, Kimball and OBT are not competing choices.",[251,455,456],{},"They happen at two different moments in the flow:",[258,458,461],{"className":459,"code":460,"language":263,"meta":264},[261],"Kimball upstream\n  -> governance, consistency, reuse\n\nOBT downstream\n  -> Power BI simplicity, performance, readability\n",[266,462,460],{"__ignoreMap":264},[251,464,465],{},"A reporting OBT is acceptable when it is fed by clean marts and does not silently redefine business concepts.",[272,467,469],{"id":468},"promotion-rule","Promotion rule",[251,471,472],{},"Information can start in the reporting layer when it serves a local need.",[251,474,475],{},"It should be promoted to a mart when it becomes reused, stable, or structural.",[258,477,480],{"className":478,"code":479,"language":263,"meta":264},[261],"Information used by one dashboard\n-> stays in reporting\n\nInformation used by several dashboards\n-> candidate for a mart\n\nCross-domain, strategic, or governed information\n-> must be in a mart\n",[266,481,479],{"__ignoreMap":264},[251,483,484],{},"This rule prevents the reporting layer from becoming a second business-truth layer.",[272,486,488],{"id":487},"promotion-examples","Promotion examples",[251,490,491],{},"These metrics can start in one report, but should be promoted if they become common:",[258,493,496],{"className":494,"code":495,"language":263,"meta":264},[261],"normalized absenteeism rate\nschool climate index\nHR risk score\nadjusted success rate\nresources-to-results ratio\ninstitutional performance status\n",[266,497,495],{"__ignoreMap":264},[251,499,500],{},"The question is not only: \"Is this metric useful?\"",[251,502,503],{},"The right question is:",[258,505,508],{"className":506,"code":507,"language":263,"meta":264},[261],"Should this metric become a shared Store definition?\n",[266,509,507],{"__ignoreMap":264},[272,511,513],{"id":512},"filter-tables-by-grain","Filter tables by grain",[251,515,516],{},"For Power BI, the reporting layer can expose filter tables adapted to the grain of the domain or report.",[251,518,293],{},[258,520,523],{"className":521,"code":522,"language":263,"meta":264},[261],"filter_ecole_annee\nfilter_sondage_theme_population\nfilter_resultat_matiere_niveau\nfilter_rh_ecole_corps_emploi\n",[266,524,522],{"__ignoreMap":264},[251,526,527],{},"These tables synchronize filters across pages, control valid combinations, and avoid repeating the same filter columns everywhere.",[251,529,530],{},"The principle is to create filter spines by grain rather than one universal filter table that mixes every domain.",[272,532,534],{"id":533},"expected-role-of-power-bi","Expected role of Power BI",[251,536,537],{},"Power BI should mainly:",[258,539,542],{"className":540,"code":541,"language":263,"meta":264},[261],"display\nfilter\nnavigate\nformat\nhandle user interaction\n",[266,543,541],{"__ignoreMap":264},[251,545,546],{},"Power BI should not carry heavy business logic when that logic can be computed in SQL\u002Fdbt.",[251,548,549],{},"This limits:",[258,551,554],{"className":552,"code":553,"language":263,"meta":264},[261],"diverging definitions across reports\nlogic hidden in DAX measures\ncalculations that are hard to test\ndependency on the Power BI semantic model\n",[266,555,553],{"__ignoreMap":264},[272,557,559],{"id":558},"doctrine","Doctrine",[251,561,562],{},"The doctrine can be summarized as:",[564,565,566],"blockquote",{},[251,567,568],{},"Marts are the canonical analytical layer, organized with Kimball modeling by business vertical. The Power BI layer does not carry heavy business logic. It consumes denormalized reporting tables, precomputed in SQL, and connected to filter tables by grain. Metrics that become reusable or structural are progressively promoted to canonical marts.",{"title":264,"searchDepth":570,"depth":570,"links":571},2,[572,573,574,575,576,577,578,579,580],{"id":274,"depth":570,"text":275},{"id":314,"depth":570,"text":315},{"id":345,"depth":570,"text":346},{"id":449,"depth":570,"text":450},{"id":468,"depth":570,"text":469},{"id":487,"depth":570,"text":488},{"id":512,"depth":570,"text":513},{"id":533,"depth":570,"text":534},{"id":558,"depth":570,"text":559},"md",null,{},true,{"title":69,"description":253},"rKqkr1gsw2MLsHsrQa7Csuo7sNnNNhJ8J9jDhxOmWyA",[588,589],{"title":65,"path":66,"stem":67,"description":264,"children":-1},{"title":73,"path":74,"stem":75,"description":264,"children":-1},1781106583963]