powerbi - 用于合并的多列行的切片器
问题描述
我有两 (2) 表:发票和产品。它们看起来像这样:
**Invoices**
InvoiceID
SalesRep
**Products**
InvoiceID
ProductID
Cost
ProductName
Invoices.InvoiceID 列是唯一的。任何发票都可能附有 1-n 个产品。在 Products 表中,可以有任意数量的重复 InvoiceID,每个都显示该 Invoice 上出现的一个 ProductID(及其成本)。
我们的企业出售使用我们产品的许可证(不是产品本身;只是许可证)。这些许可证可以每年更新。因此,在我们的数据库中,我们的产品具有“产品 A”和“产品 A(续订)”之类的名称。“(续订)”位表示该产品实际上是产品 A 的续订,而不是第一次购买许可证。除此之外,它们是相同的。
我们需要按续订和非续订(我们称之为新)来划分我们的发票及其产品。在输出表中,我们希望每张发票只有一行,无论它有多少产品。它看起来像这样:
|Invoice ID|Sales Rep|Total Cost|Renewal Products |Renewal Cost|New Products |New Cost|
|001 |F. Smith | $100|Product A (Renewal)| $100 | | |
|002 |J. Blow | $250|Product B (Renewal)| $150 |Product A | $100|
|003 |B. Bloggs| $300| | |Product C & Product D| $300|
等等。请注意,如果有多个 New 或 Renewal 产品,它们是连接在一起的。我通过 DAX 实现了这一点:
New Products = CONCATENATEX (filter(Products,
Products[InvoiceID]=min(Invoices[InvoiceID]) && iserror(SEARCH("renewal",
Products[ProductName]))),
Products[ProductName],
" & " ,
Products[ProductName],
ASC)
我为 Renewal 产品做了类似的事情。这些成本也会加在一起,因此如果有多个新产品或续订产品,它们的成本就会加在一起,例如上表中的发票 003。同样,DAX:
New Total = SUMX(FILTER(Products,
Products[Invoice ID]=min(Invoices[InvoiceID]) && iserror(SEARCH("renewal", Products[ProductName]))),
Products[Cost])
到目前为止,一切都很好。我的桌子看起来像我想要的那样。但企业希望能够按新建或续订对输出表进行切片。当他们选择其中任何一种时,就好像另一种类型的业务根本不存在。输出表中该类型业务的列将为空,总成本列将仅显示订单中所选类型的任何项目的总成本。如果任何发票只有未选择类型的产品,则该发票将从输出中完全消失。
我真的在用这个切片器苦苦挣扎,所以任何建议都将不胜感激。非常感谢
编辑
Alexis,如果原始表格如下所示:
|Invoice ID|Sales Rep|Total Cost|Renewal Products |Renewal Cost|New Products |New Cost|
|001 |F. Smith | $100|Product A (Renewal)| $100 | | |
|002 |J. Blow | $250|Product B (Renewal)| $150 |Product A | $100|
|003 |B. Bloggs| $300| | |Product C & Product D| $300|
然后在切片后只显示 New,它看起来像这样:
|Invoice ID|Sales Rep|Total Cost|Renewal Products |Renewal Cost|New Products |New Cost|
|002 |J. Blow | $100| | |Product A | $100|
|003 |B. Bloggs| $300| | |Product C & Product D| $300|
切片后只显示 Renewal,它看起来像这样:
|Invoice ID|Sales Rep|Total Cost|Renewal Products |Renewal Cost|New Products |New Cost|
|001 |F. Smith | $100|Product A (Renewal)| $100 | | |
|002 |J. Blow | $150|Product B (Renewal)| $150 | | |
这有帮助吗?
解决方案
这实际上比你想象的要简单。您需要做的就是在Products
表上创建一个计算列,以区分新行和续订行:
Slicer = IF(SEARCH("Renewal", Products[ProductName], 1, 0) > 0, "Renewal", "New")
然后将此列用作切片器,表格应按您指定的方式运行。
注意:如果您先创建此列,则您的度量可以引用它而不是使用该SEARCH
函数。IE,你可以替换
`iserror(SEARCH("renewal", Products[ProductName]))`
和
Products[Slicer] = "New"
推荐阅读
- r - 过滤行数大于列数的*n矩阵
- google-apps-script - 通过 google.script.run 上传文件
- azure - Azure 网站文件上传文件未找到异常
- sql - 根据组中值对的条件选择行
- angular - 使用 Angular 在 Azure Maps 中绘制一条线
- javascript - Fabricjs:画布内存使用超过iPad中的最大限制
- c# - Angular6 POST 请求仍处于待处理状态
- reactjs - 为什么我需要为反应原生应用安装 npm
- c - 为什么我的 C 代码会抛出分段错误,即使返回指针指向看似有效的 shellcode 的内存地址?
- python - 列表、字典或元组