首页 > 解决方案 > 用于合并的多列行的切片器

问题描述

我有两 (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 |                     |        |

这有帮助吗?

标签: powerbidaxpowerbi-desktop

解决方案


这实际上比你想象的要简单。您需要做的就是在Products表上创建一个计算列,以区分新行和续订行:

Slicer = IF(SEARCH("Renewal", Products[ProductName], 1, 0) > 0, "Renewal", "New") 

然后将此列用作切片器,表格应按您指定的方式运行。


注意:如果您先创建此列,则您的度量可以引用它而不是使用该SEARCH函数。IE,你可以替换

`iserror(SEARCH("renewal", Products[ProductName]))`

Products[Slicer] = "New"

推荐阅读