两个不同表上的PowerBI切片器/过滤器

时间:2020-06-06 01:37:04

标签: powerbi powerquery

在PowerBI中,是否可以在两个不同的表上使用两个过滤器或切片器,以便我可以过滤一个表或两个表并在显示中加入数据?

 create table person(
    id int not null,
    name char(30) not null,
    grp char(1) not null)
 create table time(
    person_id int not null,
    state char(10) not null,
    date datetime not null,
    hours int not null)
go
  insert person values (1,'PersonA1','A')
  insert person values (2,'PersonA2','A')
  insert person values (3,'PersonA3','A')
  insert person values (4,'PersonB1','B')
  insert person values (5,'PersonB2','B')
  insert person values (6,'PersonB3','B')
  insert time values(1,'Work','2020-02-01',8)
  insert time values(2,'Work','2020-02-02',8)
  insert time values(1,'Vacation','2020-03-01',8)
  insert time values(1,'Sick','2020-03-02',8)
  insert time values(3,'Work','2020-03-04',8)
  insert time values(4,'Work','2020-02-01',8)
  insert time values(2,'Sick','2020-02-02',8)
  insert time values(1,'Vacation','2020-03-01',8)
  insert time values(2,'Sick','2020-03-02',8)
  insert time values(2,'Work','2020-03-04',8)
  insert time values(4,'Vacation','2020-02-01',8)
  insert time values(5,'Work','2020-02-02',8)
  insert time values(1,'Vacation','2020-03-01',8)
  insert time values(2,'Sick','2020-03-02',8)
  insert time values(3,'Work','2020-03-04',8)

在PowerBI中,我想显示所显示表格的以下版本。在这里,我在时间表上使用“数据透视列”,并使用托管关系将输出连接成表格格式:

没有过滤器

|   person_id |   id | name     | grp   |   Sick |   Vacation |   Work |
|-------------|------|----------|-------|--------|------------|--------|
|           0 |    1 | PersonA1 | A     |      0 |          0 |      0 |
|           1 |    2 | PersonA2 | A     |      8 |         24 |      8 |
|           2 |    3 | PersonA3 | A     |     24 |          0 |     16 |
|           3 |    4 | PersonB1 | B     |      0 |          0 |     16 |
|           4 |    5 | PersonB2 | B     |      0 |          8 |      8 |
|           5 |    6 | PersonB3 | B     |      0 |          0 |      8 |

date less than 2020-03-01添加时间片或过滤器

|   person_id |   id | name     | grp   |   Sick |   Vacation |   Work |
|-------------|------|----------|-------|--------|------------|--------|
|           0 |    1 | PersonA1 | A     |      0 |          0 |      0 |
|           1 |    2 | PersonA2 | A     |      0 |          0 |      8 |
|           2 |    3 | PersonA3 | A     |      8 |          0 |      8 |
|           3 |    4 | PersonB1 | B     |      0 |          0 |      0 |
|           4 |    5 | PersonB2 | B     |      0 |          8 |      8 |
|           5 |    6 | PersonB3 | B     |      0 |          0 |      8 |

添加时间片或过滤器date for greater than 2020-03-01

|   person_id |   id | name     | grp   |   Sick |   Vacation |   Work |
|-------------|------|----------|-------|--------|------------|--------|
|           0 |    1 | PersonA1 | A     |      0 |          0 |      0 |
|           1 |    2 | PersonA2 | A     |      8 |         24 |      0 |
|           2 |    3 | PersonA3 | A     |     16 |          0 |      8 |
|           3 |    4 | PersonB1 | B     |      0 |          0 |     16 |
|           4 |    5 | PersonB2 | B     |      0 |          0 |      0 |
|           5 |    6 | PersonB3 | B     |      0 |          0 |      0 |

在grp上同时显示一个过滤器,以显示A和B或仅显示A或B的组合。

使用两个过滤器,例如Grp = A and date < 2020-03-01过滤器

|   person_id |   id | name     | grp   |   Sick |   Vacation |   Work |
|-------------|------|----------|-------|--------|------------|--------|
|           0 |    1 | PersonA1 | A     |      0 |          0 |      0 |
|           1 |    2 | PersonA2 | A     |      0 |          0 |      8 |
|           2 |    3 | PersonA3 | A     |      8 |          0 |      8 |

或者,Grp = B and date > 2020-03-1过滤器

|   person_id |   id | name     | grp   |   Sick |   Vacation |   Work |
|-------------|------|----------|-------|--------|------------|--------|
|           3 |    4 | PersonB1 | B     |      0 |          0 |     16 |
|           4 |    5 | PersonB2 | B     |      0 |          0 |      0 |
|           5 |    6 | PersonB3 | B     |      0 |          0 |      0 |

还是两个过滤器的任意组合?

2 个答案:

答案 0 :(得分:1)

这似乎是Power BI的基础知识。创建关系

Relationship

这使一切都按预期工作。

没有过滤器

Visual 1

按日期和组使用切片器

Visual 2

将空白显示为零

*根据OP的评论添加

在上述示例中,矩阵可视化中缺少没有值的数据(例如,第二幅图中的“ PersonA3”和“ Vacation”)。

这是因为,默认的“总和”汇总将不显示任何数据而返回空白,并且“矩阵”可视化视图不显示空白。

如果要使用“零”而不是空白,则需要显式定义DAX Measure,该DAX Measure不返回零数据。

有很多方法可以做到,但是这可能是最简单的方法。

1。为切片器创建单独的表。

将“国家”维度输入一个单独的维度表,然后与原始“时间”表创建关系。

Relationship 2

这是必要的,以确保“矩阵”视觉对象显示所有状态,而不管“时间”表中是否存在受过滤器/切片器影响的状态。

2。定义DAX度量。

如果没有数据落入当前过滤器上下文中,则默认的Sum量度将返回BLANK。您需要定义一个新度量,该度量在没有数据时返回零。这可能是最简单的公式。

Total Hours = SUM ( Times[Hour] ) + 0

矩阵用零填充,然后返回“ PersonA3”和“假期”。

Result

答案 1 :(得分:0)

是的,当您使用powerquery时是可能的

  1. 要进行过滤,可以使用Table.SelectRows

https://docs.microsoft.com/en-us/powerquery-m/table-selectrows

看起来会越来越少(我没有测试过)

filteredTable = Table.SelectRows(yourTable, each [date] <= #datetime(2020, 3, 01, 0, 0, 0)

它将为您提供新表格作为响应

  1. 要返回修改后的表(具有不同的列),可以使用Table.TransformRows

https://docs.microsoft.com/en-us/powerquery-m/table-transformrows

Table.TransformRows(
    yourFilteredTable,
    (row) as record => [person_id, id , name, grp, Sick, Vacation, Work  ]
)

它将返回新表

  1. 要合并表,可以使用Table.Combine-给两个表,然后合并一个表

https://docs.microsoft.com/en-us/powerquery-m/table-combine

Table.Combine({
    tableOne,
    tableTwo
})