web-dev-qa-db-ja.com

複数の列をフィルタリングするスライサーを作成する

助けてください、私はこのテーブルを持っています{Table1}

+----+---------+---------+-------+
| ID | Member1 | Member2 | Score |
+----+---------+---------+-------+
|  1 | John    | Jack    |    10 |
|  2 | Jack    | John    |    20 |
|  3 | John    | John    |    30 |
|  4 | Jack    | Jack    |    40 |
|  5 | Sara    | Maya    |    50 |
|  6 | Jack    | Mia     |    60 |
|  7 | Maya    | John    |    70 |
+----+---------+---------+-------+

たとえば、{John、Jack}のように複数の選択を行うときに、スライサーを使用している可能性はありますか?

ジョンとジャックが一緒に取り組んだ行が表示されます

期待される結果:

+----+---------+---------+-------+
| ID | Member1 | Member2 | Score |
+----+---------+---------+-------+
|  1 | John    | Jack    |    10 |
|  2 | Jack    | John    |    20 |
+----+---------+---------+-------+

これまで、カスタムテーブルを作成してスライサーに配置しようとしましたが、複数選択できません

Members = 
DISTINCT (
    UNION (
        SELECTCOLUMNS ( Table1, "T", Table1[Member1] ),
        SELECTCOLUMNS ( Table1, "T", Table1[Member2] )
    )
)

次に、このメジャーを表1に作成し、フィルター処理して値1を表示しました。

ShowRow = 
IF (
    HASONEVALUE ( 'Members'[T] ),
    IF (
        COUNTROWS ( FILTER ( Table1, Table1[Member1] = VALUES ('Members'[T] ) ) )
            || COUNTROWS ( FILTER ( Table1, Table1[Member2] = VALUES ( 'Members'[T] ) ) ),

        1,
        0
    )
)
4
sara

詳細な説明をありがとうございます。あなたの例はソリューションの開発に役立ちました。次の方法が機能するはずです。

  • 行ったようにMembersテーブルを作成します

    Members =     DISTINCT (
       UNION (
           SELECTCOLUMNS ( Table1, "T", Table1[Member1] ),
           SELECTCOLUMNS ( Table1, "T", Table1[Member2] )
       )    )
    
  • テーブル間に2つの関係を作成します。 [〜#〜] t [〜#〜]Member1の間の1つ)、および[〜#〜] t [〜#〜]Member2。関係の1つが非アクティブになりますが、これは問題ありません。

Here is what the relationship should look like

  • 次に、メンバーがそれぞれの列に存在するかどうかを計算する2つのメジャーを作成します。それぞれで使用する関係を選択して、目的の結果を得ることができます。

    InMember1 = SUMX(CALCULATETABLE(Table1,USERELATIONSHIP('Members'[T],Table1[Member2])),1)
    
    InMember2 = SUMX(CALCULATETABLE(Table1,USERELATIONSHIP('Members'[T],Table1[Member1])),1)
    
  • 次に、最終的なメジャーを作成して、それらがどちらかの列にあるかどうかを計算します

    InEither = IF([InMember1]+[InMember2]>0,1,0)
    

これがファイナルテーブルのサンプルです(申し訳ありませんが、まだ画像を埋め込むことはできません)。

Click here to view image.

関係がどのように機能するかにより、元のScore列がすべての行に表示されるわけではないことに気付くでしょう。この問題を解決するためにNewScoreメジャーを作成しました

NewScore = 
VAR Score1 = SUMX(CALCULATETABLE(Table1,USERELATIONSHIP('Members'[T],Table1[Member1])),Table1[Score])
VAR Score2 = SUMX(CALCULATETABLE(Table1,USERELATIONSHIP('Members'[T],Table1[Member2])),Table1[Score])
RETURN IF(ISBLANK(Score1),Score2,IF(ISBLANK(Score2),Score1,Score1))

また、将来の参照に役立つ可能性があるため、この記事にリンクしたいと思います: https://www.sqlbi.com/articles/userelationship-in-calculated-columns/

3
Stu

まず、すべてのメンバーを含む新しいテーブルを作成します(そして、テーブルとの関係は作成しません)。

Members = DISTINCT(UNION(VALUES(Table2[Member1]), VALUES(Table2[Member2])))

(これはデフォルトで列名Member1になりますが、必要に応じて名前をMemberまたはTに変更します。)

このリストができたので、必要なのはメジャーを記述してそれをフィルターとして使用することだけです。

ShowRows := IF(
                COUNTROWS(
                    INTERSECT(
                        VALUES('Members'[Member]),
                        {MAX(Table2[Member1]), MAX(Table2[Member2])}
                    )
                ) = 2, 1, 0 )

Members[Member]を使用してスライサーを作成すると、VALUES関数は選択したメンバーのリストを返します。これをテーブルの現在の行のMember1およびMember2と交差させると(MAXは行コンテキストから各値を抽出するために使用されます)、2のみが取得されます。両方のメンバーがスライサーの選択に含まれている場合。

これで、ShowRowsメジャーをビジュアルレベルフィルターに追加し、それをis 1に設定するだけです。

0
Alexis Olson