web-dev-qa-db-fra.com

Comment créer un segment pour filtrer plusieurs colonnes

S'il vous plaît aider, j'ai ce tableau {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 |
+----+---------+---------+-------+

Est-il possible que j'ai un slicer que par exemple lorsque je fais une sélection multiple comme {John, Jack}

il va me montrer les lignes sur lesquelles John et Jack ont ​​travaillé ensemble

Résultat attendu:

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

Jusqu'ici, j'ai essayé de créer une table personnalisée et de la placer dans le segment, mais je ne peux pas faire de sélection multiple.

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

Puis j'ai créé cette mesure dans le tableau 1 et l'ai filtrée pour afficher la valeur 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

Merci pour la description détaillée, votre exemple a été utile pour développer une solution. La méthode suivante devrait fonctionner:

  • Créez la table Members comme vous l'avez fait

    Members =     DISTINCT (
       UNION (
           SELECTCOLUMNS ( Table1, "T", Table1[Member1] ),
           SELECTCOLUMNS ( Table1, "T", Table1[Member2] )
       )    )
    
  • Créez deux relations entre les tables. Un entre T et Member1, et l'autre entre T et Member2. Une des relations sera inactive, ce qui est bien.

Here is what the relationship should look like

  • Créez maintenant deux mesures pour calculer si le membre est présent dans la colonne respective. Nous pouvons sélectionner la relation que nous voulons utiliser dans chacun pour obtenir le résultat souhaité.

    InMember1 = SUMX(CALCULATETABLE(Table1,USERELATIONSHIP('Members'[T],Table1[Member2])),1)
    
    InMember2 = SUMX(CALCULATETABLE(Table1,USERELATIONSHIP('Members'[T],Table1[Member1])),1)
    
  • Maintenant, créez une mesure finale pour calculer si elles sont dans l'une ou l'autre colonne

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

Voici un exemple de la table finale (désolé, je ne peux pas encore incorporer d'images). 

Click here to view image.

Vous remarquerez que la colonne d'origine Score ne s'affiche pas pour chaque ligne en raison du fonctionnement des relations. J'ai créé une mesure NewScore pour résoudre ce problème

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

Je souhaite également créer un lien vers cet article, car il peut être utile pour référence ultérieure: https://www.sqlbi.com/articles/userelationship-in-calculated-columns/

3
Stu

Commencez par créer une nouvelle table contenant tous les membres (et ne créez aucune relation avec elle).

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

(Cela donnera par défaut le nom de colonne Member1, mais renommez-le en Member ou T si vous préférez.)

Maintenant que nous avons cette liste, tout ce que nous avons à faire est d’écrire une mesure et de l’utiliser comme filtre.

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

Lorsque vous créez un segment utilisant Members[Member], la fonction VALUES renverra une liste des membres que vous avez sélectionnés. Lorsque vous intersectez ceci avec Member1 et Member2 à partir de la ligne actuelle de votre table (MAX est utilisé pour extraire chaque valeur du contexte de ligne), vous obtenez uniquement 2 si les deux membres sont dans votre sélection de segmenteur.

Il ne vous reste plus qu'à ajouter la mesure ShowRows au filtre de niveau visuel et à la définir sur is 1.

0
Alexis Olson