Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Microsoft is giving away 50,000 FREE Microsoft Certification exam vouchers. Get Fabric certified for FREE! Learn more

v-rzhou-msft

如何使用DAX快速创建示例表

场景: 

 

在论坛中,经常需要一个示例文件帮助我们描述问题,但是由于隐私限制了真实数据的提供,我们通常会选择在Desktop中创建虚拟数据并建立模型来解决问题。这避免了对问题的描述存在字面上的歧义并且帮助遇到问题的人快速理解,以此来增加问题解决的可能性。从长远来看,花费大量时间创建示例数据是有价值的。这篇文章演示了如何使用DAX函数快速创建销售事实表。 

 

具体操作如下: 

1、创建一张日期维度表 

 

度量: 

 

 

开始日期 = DATE(2021,1,1) 
结束日期 = DATE(2022,12,31)

 

 

用下面的公式创建一个计算表: 

 

 

Calendar =  

ADDCOLUMNS ( 

    CALENDAR ( [开始日期], [结束日期] ), 

    "年", YEAR ( [Date] ), 

    "季度", "Q" & QUARTER ( [Date] ), 

    "月份名称", FORMAT ( [Date], "mmm" ), 

    "月数", MONTH ( [Date] ), 

    "周", "W" & WEEKNUM ( [Date], 2 ), 

    "工作日", WEEKDAY ( [Date], 2 ) 

)  

 

 

vrzhoumsft_0-1738808604505.png

 

2、创建一个事实表(例如:销售事实)如下: 

 

在事实表中添加日期 

 

 

VAR _Date = 

CALENDAR( 

    [开始日期], [结束日期] 

)    

 

 

vrzhoumsft_1-1738808655765.png

 

在事实表中添加产品数据 

 

 

VAR _ProductCategory = 

DATATABLE ( 

"产品名称", STRING, 

{ 

{ " 产品1 " }, 

{ " 产品2 " }, 

{ " 产品3 " } 
} 

) 

 

 

vrzhoumsft_2-1738808693837.png

 

扩展产品信息:添加每个产品的销售价格和成本价 

 

 

VAR _DimProductCategory = 

DATATABLE ( 

"产品名称", STRING, 

"销售价格", INTEGER, 

"成本价", INTEGER, 

{ 

        { " 产品1 ", 80, 30 }, 

        { " 产品2 ", 50, 15 }, 

        { " 产品3 ", 70, 35 } 

 } 

) 

 

 

vrzhoumsft_3-1738808714105.png

 

向事实表中添加商店数据: 

 

 

VAR _DimStore = 

DATATABLE ( 

"商店名称", STRING, 

    { 

        { " 商店1 " }, 

        { " 商店2 " }, 

        { " 商店3 " } 

    } 

) 

 

 

vrzhoumsft_4-1738808732826.png

 

合并_DimProductCategory和_DimStore 

 

 

VAR _DimTable = GENERATE ( _DimStore, _DimProductCategory ) 

 

 

vrzhoumsft_5-1738808745148.png

合并_DimProductCategory和_DimStore 

 

 

VAR _FactTableBase = GENERATE ( _Date, _DimTable ) 

 

 

vrzhoumsft_6-1738808757675.png

 

这里使用了GENERATE函数,它的语法是GENERATE(<table1>, <table2>),它返回一张表,其中table1 中的每一行与 table2中当前行的上下文进行笛卡尔积计算得到表。 

 

向事实表中添加销售、销售额、销售商品成本、利润和指数数据 

 

 

VAR _FactTable1 = 

 ADDCOLUMNS ( _FactTableBase, "出售", RANDBETWEEN ( 1, 99 ) ) 

// 这里添加了一个单独的变量来修复[Sold]字段。 

VAR _FactTable = 

ADDCOLUMNS ( 

_FactTable1, 

 " 销售 ", [销售价格] * [出售], 

 " 销售成本 ", [成本价] * [出售], 

 " 利润 ", ( [销售价格] - [成本价] ) * [出售], 

 " 索引 ",RANKX ( _FactTable1, [Date] & [商店名称] & [产品名称],, ASC, DENSE ) 

) 

 

 

vrzhoumsft_7-1738808809149.png

 

Factsales的完整公式如下: 

 

 

FactSales =  

VAR _Date = 

CALENDAR( 

    [开始日期], [结束日期] 

)     

VAR _ProductCategory = 

DATATABLE ( 

    "产品名称", STRING, 

    { 

        { " 产品1 " }, 

        { " 产品2 " }, 

        { " 产品3 " } 

    } 

) 

VAR _DimProductCategory = 

DATATABLE ( 

    "产品名称", STRING, 

    "销售价格", INTEGER, 

    "成本价", INTEGER, 

    { 

        { " 产品1 ", 80, 30 }, 

        { " 产品2 ", 50, 15 }, 

        { " 产品3 ", 70, 35 } 

    } 

) 

VAR _DimStore = 

DATATABLE ( 

    "商店名称", STRING, 

    { 

        { " 商店1 " }, 

        { " 商店2 " }, 

        { " 商店3 " } 

    } 

) 

VAR _DimTable = GENERATE ( _DimStore, _DimProductCategory ) 

VAR _FactTableBase = GENERATE ( _Date, _DimTable ) 

VAR _FactTable1 = 

    ADDCOLUMNS ( _FactTableBase, "出售", RANDBETWEEN ( 1, 99 ) ) 

VAR _FactTable = 

    ADDCOLUMNS ( 

        _FactTable1, 

        " 销售 ", [销售价格] * [出售], 

        " 销售成本 ", [成本价] * [出售], 

        " 利润 ", ( [销售价格] - [成本价] ) * [出售], 

        " 索引 ",RANKX ( _FactTable1, [Date] & [商店名称] & [产品名称],, ASC, DENSE ) 

    ) 

RETURN 

_FactTable 

 

 

 

总结: 

 

公式分为几个变量,其中一些可以继续扩展和添加更多的数据,比如销售数量由函数RANDBETWEEN()返回一个随机值,可以嵌套一层IF()或SWITCH()函数来模拟销售旺季和淡季,或者使数据线性增加或减少。生成的事实表也可以复制到其他地方进行快速过滤和更改(注意,在Power Query Editor中,复制到表中的最大数据量限制为3000个单元格,Excel中没有这个限制)。希望这能帮助您节省创建类似示例文件的时间,谢谢!

 

原作者:Changqing Gao
审核: Ula Huang, Kerry Wang

翻译:Nuo Chen