求DAX表达式:统计版本数大于1的文档数量
统计多版本文档的DAX正确写法
现有三个表:Folders、Documents、Versions,表结构及数据如下:
Folders表
| FolderID | Folder Name |
|---|---|
| 1 | Folder 1 |
| 2 | Folder 2 |
| 3 | Folder 3 |
Documents表
| DocID | Doc Name | FolderID |
|---|---|---|
| 1000 | Doc 1 | 1 |
| 1001 | Doc 2 | 1 |
| 1002 | Doc 3 | 2 |
| 1003 | Doc 4 | 2 |
| 1004 | Doc 5 | 3 |
Versions表
| VersionID | DocID |
|---|---|
| 1 | 1000 |
| 2 | 1001 |
| 3 | 1001 |
| 4 | 1002 |
| 5 | 1003 |
| 6 | 1003 |
| 7 | 1004 |
需求:统计版本数大于1的文档数量,按Folder维度统计,预期结果是Folder1和Folder2各有1个符合条件的文档,Folder3没有。
你尝试的DAX表达式存在逻辑问题:
Count Docs = VAR VersionsMin = 2 RETURN CALCULATE ( COUNT ( 'Documents'[DocID] ), FILTER ( 'Versions', COUNT ( 'Versions'[VersionID] ) >= VersionsMin ) )
问题分析
原表达式里,FILTER('Versions', COUNT('Versions'[VersionID]) >= VersionsMin)是对整个Versions表的版本数进行计数,不是按每个DocID分组统计单文档的版本数,所以无法精准筛选出版本数≥2的文档,自然得不到正确结果。
正确DAX写法
以下几种写法都能实现需求:
写法一:先筛选符合条件的文档再计数
Count Docs = VAR VersionsMin = 2 VAR DocsWithMultipleVersions = CALCULATETABLE ( VALUES ( Documents[DocID] ), GROUPBY ( Versions, Versions[DocID], "VersionCount", COUNTX ( CURRENTGROUP (), Versions[VersionID] ) ), [VersionCount] >= VersionsMin ) RETURN COUNTROWS ( INTERSECT ( VALUES ( Documents[DocID] ), DocsWithMultipleVersions ) )
写法二:逐文档判断后汇总
Count Docs = VAR VersionsMin = 2 RETURN SUMX ( VALUES ( Documents[DocID] ), IF ( CALCULATE ( COUNT ( Versions[VersionID] ) ) >= VersionsMin, 1, 0 ) )
写法三:直接筛选文档后统计行数
Count Docs = VAR VersionsMin = 2 RETURN COUNTROWS ( FILTER ( VALUES ( Documents[DocID] ), CALCULATE ( COUNT ( Versions[VersionID] ) ) >= VersionsMin ) )
逻辑说明
这几种写法的核心都是:先按单个DocID统计对应的版本数,筛选出版本数≥2的文档,再结合当前Folder的上下文,统计这些文档的数量,最终得到按文件夹维度的正确结果。
内容的提问来源于stack exchange,提问作者Tim Elley
相关产品推荐
相关产品推荐

