合并的多列行的切片器

时间:2018-08-22 23:26:39

标签: powerbi dax powerbi-desktop

我有两(2)张表:“发票”和“产品”。他们看起来像这样:

**Invoices**
InvoiceID
SalesRep

**Products**
InvoiceID
ProductID
Cost
ProductName

Invoices.InvoiceID列是唯一的。任何发票都可能附有1-n个产品。在“产品”表中,可以有任意数量的重复InvoiceID,每个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|

以此类推。请注意,如果有多个新产品或续订产品,则将它们串联在一起。我是通过DAX实现的:

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

,我为续订产品做了类似的操作。成本也相加在一起,因此,如果有多个新产品或续订产品,则它们的成本相加在一起,就像上表中的发票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|

切成仅显示续订后,看起来像这样:

|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 |                     |        |

有帮助吗?

1 个答案:

答案 0 :(得分:0)

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

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

然后将此列用作切片器,该表的行为应与您指定的一样。


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

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

使用

Products[Slicer] = "New"