DAX 实战 | 手把手教你使用表函数生成销售表和汇总表

本文介绍了如何使用DAX的表函数,如GENERATE和CROSSJOIN,来生成笛卡尔积表和汇总表。通过示例详细解释了如何创建销售表,以及如何通过SUMMARIZE函数来计算每个月每个门店的销售额。

前言

常见的DAX函数返回的是一个值,比如SUM,MAX等,称为值函数,与此同时,DAX中还有很多返回表的表函数,比如FILTER,ALL,VALUES,DISTINCT这些都是比较常用的表函数,新建度量值、新建列都是需要返回一个值,如果用返回表的表达式来创建,将会报错,而新表就是利用DAX创建一个表,它使用的就是返回表的表达式。今天我们来介绍的就是除了上述所说的表函数外,还有一些生成笛卡尔积和返回汇总表的表函数,他们也是我们工作中会经常用来做辅助计算的。

用于生成笛卡尔积表的两个函数

首先,我们来生成一张销售表,在这个过程中,我们将会简单介绍一下生成笛卡尔积表的函数GENERATE和CROSSJOIN。

函数示例一:GENERATE应用示例

销售表 =
GENERATE (
ADDCOLUMNS (
CALENDAR ( DATE ( 2019, 1, 1 ), TODAY () ),
“月”, MONTH ( [Date] ),
“销量”, RANDBETWEEN ( 0, 300 )
),
DATATABLE ( “门店”, STRING, { { “北京” }, { “上海” }, { “广州” }, { “深圳” } } )
)

在实例的这个函数中,GENERATE,ADDCOLUMNS,DATATABLE,是主要需要说明的三个生成表的函数。

ADDCOLUMNS函数(DAX)

ADDCOLUMNS(<table>, <name>, <expression>[,<name>, <expression>

<think>我们正在使用DAX语言,在PowerBI或PowerPivot等环境中。用户的问题:如何在使用DISTINCTCOUNT函数时,先对中的A字段等于1进行筛选。分析: DISTINCTCOUNT函数用于计算某列中不同值的个数。如果我们需要先筛选(例如,只考虑列A等于1的行),然后再对另一列进行去重计数,我们可以使用FILTER函数来先过滤,或者使用CALCULATE函数来改变上下文。有两种常见方法:方法1:使用CALCULATE函数,它可以通过过滤器参数修改上下文。方法2:在DISTINCTCOUNT函数内部使用FILTER函数,但注意DISTINCTCOUNT本身不接受作为参数,所以通常需要与CALCULATE配合。因此,我们通常这样写:```Measure =CALCULATE(DISTINCTCOUNT(TableName[ColumnName]), TableName[A] =1) ```或者,更明确地使用FILTER函数:``` Measure= CALCULATE(DISTINCTCOUNT(TableName[ColumnName]),FILTER(TableName,TableName[A]=1))```但是,第一种写法是隐式的过滤器,它实际上是语法糖,会被转换为第二种形式。在简单情况下,第一种写法更简洁。因此,我们推荐:``` Measure= CALCULATE(DISTINCTCOUNT(TableName[ColumnName]),TableName[A]=1)```注意:如果列A的数据类型是文本,那么条件应该写为:`TableName[A]= "1"`。现在,按照要求,我们需要生成相关问题。注意:用户的问题是关于DAX中如何在使用DISTINCTCOUNT时进行筛选,因此相关问题可以围绕DAX的其他筛选场景、性能优化、其他函数使用等。</think>### DAX DISTINCTCOUNT函数筛选应用 在DAX使用`DISTINCTCOUNT`函数时,若需先筛选(仅保留列A=1的行),推荐使用`CALCULATE`函数修改上下文环境。具体实现如下: ```dax 结果 = CALCULATE( DISTINCTCOUNT(名[目标列]), -- 需要去重计数的列 FILTER( -- 筛选器函数 ALL(名[列A]), -- 清除外部上下文影响 名[列A] = 1 -- 筛选条件 ) ) ``` #### 关键点解析: 1. **`CALCULATE`函数**:核心上下文转换函数,允许在计算前修改筛选条件[^1] 2. **`FILTER`函数**:创建行级筛选,返回满足条件的行子集 3. **`ALL`函数**:清除列A上的外部筛选上下文,确保条件独立生效 4. **筛选逻辑**:先过滤出列A=1的所有行,再对目标列执行去重计数 #### 替代简化写法: ```dax 结果 = CALCULATE( DISTINCTCOUNT(名[目标列]), 名[列A] = 1 -- 隐式转换为筛选上下文 ) ``` > ⚠️ 简化写法在复杂模型可能受外部上下文影响,建议优先使用`FILTER+ALL`组合 #### 实际应用示例: 假设销售有`产品ID`、`类别`、`销售额`三列,需统计"电子产品"类别的唯一产品数: ```dax 电子产品计数 = CALCULATE( DISTINCTCOUNT(销售[产品ID]), FILTER( ALL(销售[类别]), 销售[类别] = "电子产品" ) ) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值