我有一个包含下表的数据库:
客户、发票、推销员、目标。
关心我问题的是客户、发票。
发票中使用了客户ID,但客户表中不存在这些客户ID。
如果我仅使用客户表中的客户,我的客户维度将不完整。
我的解决方案是将发票中的这些 ID 附加到客户,并用空值填充客户表中的其他列。
我不知道根据 Kimball 的说法这是否是最好的方法?
另外,如果这是一个好的解决方案,我如何添加使用Power bi Desktop来完成它?
客户表:“生成的数据”
发票表:
.....只是一个示例,表格有数千行。
这里有两点:
首先,(至少在导入模式下)PBI 已经为事实表中存在但在维度表中缺失的项目创建了“空白行”,正是针对这种情况。如果您不需要每个缺失客户 ID 的粒度,那么您不需要执行任何操作。
其次,如果您需要保留这种粒度,那么您的方法就是正确的。在Power Query中执行此操作的方法如下:
请记住,这是 Kimball,而不是 Kimble。
There are 4 steps of DWH Methodology:
1) Understand Business Process (What your process is actually measuring?)
2) Deciding the grain (It means what every row in your fact table actually represents?)
3) Deciding Dimensions (Ask Where-What-Who-Where-How-HowMany-HowMuch to your grain declaration formed together with business processing)
4) Define Facts (Metrics)
根据这个顺序,您在构建事实表之前定义维度表:如果您的维度表(本例中的客户表)在事实表中可用的客户方面缺失,根据 DWH 维度建模,我最大的建议是正确设置您的顾客餐桌!在你的维度表中定义每一个客户!!!!然后用记录填充事实表:
[Customer ID] in Customer Table : PRIMARY KEY
[CustomerID] in Invoice Table : FOREIGN KEY
SQL and Power BI reacts very differently in your problem:
1) Power BI has no referential integrity concept: It adds a blank row to your dimension table in such a case.
2) SQL gives referential integrity error, and you can't even add rows to your fact table. I support SQL in this case personally!!!!
最后:使用一些 ETL 工具(SSIS、Talend、ODI 甚至 Power Query)使维度表尽可能准确: 例如:
请勿将任何列值留为空!
如果存在未知日期,请输入默认日期值,例如“1900-12-31” 如果文本属性未知,请输入关键字“未知”、“不可用”等..
因为维度表是SQL语句查询的来源;并且不同的 SQL 供应商(SQL Server、Oracle、MySQL)必须以不同的方式处理 NULL 值,这会导致性能方面的问题!!