合并的多列行的切片器

Slicer for Merged, Multi-Column Rows

我有两 (2) 个 table:发票和产品。它们看起来像这样:

**Invoices**
InvoiceID
SalesRep

**Products**
InvoiceID
ProductID
Cost
ProductName

Invoices.InvoiceID 列是唯一的。任何发票都可能附有 1-n 种产品。在产品 table 中,可以有任意数量的重复 InvoiceID,每个都显示该发票上出现的一个 ProductID(及其成本)。

我们的企业出售使用我们产品的许可证(不是产品本身;只是许可证)。这些许可证可以每年更新。所以在我们的数据库中,我们的产品有像 'Product A' 和 'Product A (Renewal)' 这样的名称。 '(Renewal)' 位表示该产品实际上是产品 A 的续订,而不是首次购买许可证。除此之外,它们是相同的。

我们需要按续订和非续订(我们称之为新)拆分我们的发票及其产品。在输出 table 中,我们只需要每张发票一行,无论它有多少产品。它看起来像这样:

|Invoice ID|Sales Rep|Total Cost|Renewal Products   |Renewal Cost|New Products         |New Cost|
|001       |F. Smith |      0|Product A (Renewal)|       0 |                     |        |
|002       |J. Blow  |      0|Product B (Renewal)|       0 |Product A            |    0|
|003       |B. Bloggs|      0|                   |            |Product C & Product D|    0|

等等。请注意,如果有多个 New 或 Renewal 产品,它们将被串联起来。我通过 DAX 实现了这一点:

New Products = CONCATENATEX (filter(Products,
                                    Products[InvoiceID]=min(Invoices[InvoiceID]) && iserror(SEARCH("renewal", 
Products[ProductName]))),
                             Products[ProductName],
                             " & " ,
                             Products[ProductName],
                             ASC)

我为 Renewal 产品做了一个类似的。成本也加在一起,因此如果有多个新产品或续订产品,它们的成本加在一起,就像上面 table 中的发票 003 一样。同样,DAX:

New Total = SUMX(FILTER(Products,
                        Products[Invoice ID]=min(Invoices[InvoiceID]) && iserror(SEARCH("renewal", Products[ProductName]))), 
                 Products[Cost])

到目前为止,还不错。我让 table 看起来像我想要的那样。但是企业希望能够通过 New 或 Renewal 对输出 table 进行切片。当他们选择其中一个时,就好像其他类型的企业根本不存在一样。输出 table 中该业务类型的列将为空,总成本列将仅显示订单中所选类型的任何项目的总成本。如果任何发票只有未选择类型的产品,则该发票将从输出中完全消失。

我真的很苦恼这个切片器,所以任何建议都将不胜感激。非常感谢


编辑

Alexis,如果原来的table是这样的:

|Invoice ID|Sales Rep|Total Cost|Renewal Products   |Renewal Cost|New Products         |New Cost|
|001       |F. Smith |      0|Product A (Renewal)|       0 |                     |        |
|002       |J. Blow  |      0|Product B (Renewal)|       0 |Product A            |    0|
|003       |B. Bloggs|      0|                   |            |Product C & Product D|    0|

然后切片后只显示新的,它看起来像这样:

|Invoice ID|Sales Rep|Total Cost|Renewal Products   |Renewal Cost|New Products         |New Cost|
|002       |J. Blow  |      0|                   |            |Product A            |    0|
|003       |B. Bloggs|      0|                   |            |Product C & Product D|    0|

切片后只显示续订,它看起来像这样:

|Invoice ID|Sales Rep|Total Cost|Renewal Products   |Renewal Cost|New Products         |New Cost|
|001       |F. Smith |      0|Product A (Renewal)|       0 |                     |        |
|002       |J. Blow  |      0|Product B (Renewal)|       0 |                     |        |

有帮助吗?

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

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

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


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

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

Products[Slicer] = "New"