2017-07-08 4 views
4

Comment faire une jointure gauche dans DAX? Lorsque j'essaie d'ajouter une relation ou d'utiliser la fonction DAX de la jointure externe gauche, j'obtiens les erreurs suivantes (voir ci-dessous). Toutes les idées seraient grandement appréciées!Jointure externe gauche utilisant DAX dans PowerBI (relation plusieurs-à-plusieurs)

Erreur lors de la création relation: You can't create a relationship between these two columns becasue one of the columns must have unique values.

Erreur lors de la tentative NaturalLeftOuterJoin() No common join columns detected. The join function 'NATURALLEFTOUTERJOIN' requires at-least one common join column.

Pour référence, je suis en train de créer des lignes calculées d'un compte de résultat.

Exemple:

  • Chiffre d'affaires: 100
  • Coût: 80
  • Résultat: 20 (Revenu-coût)

Mes tableaux sont comme ci-dessous:

 
Fact table: 
╔═══════════╦═════════╦═══════════╦════════╗ 
║ YearMonth ║ StoreID ║ AccountID ║ Amount ║ 
╠═══════════╬═════════╬═══════════╬════════╣ 
║ 2017-01 ║ A  ║   1 ║ 100 ║ 
║ 2017-01 ║ B  ║   1 ║ 200 ║ 
║ 2017-01 ║ A  ║   2 ║ -50 ║ 
║ 2017-01 ║ B  ║   2 ║ -50 ║ 
║ 2017-02 ║ A  ║   1 ║  20 ║ 
║ 2017-02 ║ B  ║   1 ║ 150 ║ 
║ 2017-02 ║ B  ║   2 ║ -20 ║ 
╚═══════════╩═════════╩═══════════╩════════╝ 

Template table: 
╔════════════╦═══════════╦═════════╗ 
║ TemplateID ║ AccountID ║ Line ║ 
╠════════════╬═══════════╬═════════╣ 
║  105 ║   1 ║ Revenue ║ 
║  105 ║   2 ║ Cost ║ 
║  105 ║   1 ║ Profit ║ 
║  105 ║   2 ║ Profit ║ 
╚════════════╩═══════════╩═════════╝ 

Dans SQL c'est super facile - je fais juste une jointure externe gauche sur le terrain accountId qui crée des enregistrements pour la ligne de profit, comme ci-dessous:

SELECT 
     f.[YearMonth] 
     ,f.[StoreID] 
     ,f.[AccountID] 
     ,f.[Amount] 
     ,t.[TemplateID] 
     ,t.[AccountID] 
     ,t.[Line] 
    FROM [dbo].[Fact] f 
    left join [dbo].[Templates] t 
    on f.[AccountID] = t.[AccountID] 

Résultat:

╔═══════════╦═════════╦═══════════╦════════╦════════════╦═══════════╦═════════╗ 
║ YearMonth ║ StoreID ║ AccountID ║ Amount ║ TemplateID ║ AccountID ║ Line ║ 
╠═══════════╬═════════╬═══════════╬════════╬════════════╬═══════════╬═════════╣ 
║ 2017-01 ║ A  ║   1 ║ 100 ║  105 ║   1 ║ Revenue ║ 
║ 2017-01 ║ B  ║   1 ║ 200 ║  105 ║   1 ║ Revenue ║ 
║ 2017-02 ║ A  ║   1 ║  20 ║  105 ║   1 ║ Revenue ║ 
║ 2017-02 ║ B  ║   1 ║ 150 ║  105 ║   1 ║ Revenue ║ 
║ 2017-01 ║ A  ║   2 ║ -50 ║  105 ║   2 ║ Cost ║ 
║ 2017-01 ║ B  ║   2 ║ -50 ║  105 ║   2 ║ Cost ║ 
║ 2017-02 ║ B  ║   2 ║ -20 ║  105 ║   2 ║ Cost ║ 
║ 2017-01 ║ A  ║   1 ║ 100 ║  105 ║   1 ║ Profit ║ 
║ 2017-01 ║ B  ║   1 ║ 200 ║  105 ║   1 ║ Profit ║ 
║ 2017-02 ║ A  ║   1 ║  20 ║  105 ║   1 ║ Profit ║ 
║ 2017-02 ║ B  ║   1 ║ 150 ║  105 ║   1 ║ Profit ║ 
║ 2017-01 ║ A  ║   2 ║ -50 ║  105 ║   2 ║ Profit ║ 
║ 2017-01 ║ B  ║   2 ║ -50 ║  105 ║   2 ║ Profit ║ 
║ 2017-02 ║ B  ║   2 ║ -20 ║  105 ║   2 ║ Profit ║ 
╚═══════════╩═════════╩═══════════╩════════╩════════════╩═══════════╩═════════╝ 

Ensuite, je peux pivoter comme ça:

╔═════════╦═════════╦═════════╗ 
║ Line ║ Store A ║ Store B ║ 
╠═════════╬═════════╬═════════╣ 
║ Revenue ║  120 ║  350 ║ 
║ Cost ║  -50 ║  -70 ║ 
║ Profit ║  70 ║  280 ║ 
╚═════════╩═════════╩═════════╝ 

Dans DAX, il semble beaucoup plus complexe - j'espère que quelqu'un peut me prouver le contraire! J'ai lu le filtrage bidirectionnel peut permettre des relations de plusieurs-à-plusieurs, mais je ne pouvais pas le faire fonctionner ici. La raison pour laquelle j'essaie de faire cela est de rejoindre DAX plutôt que SQL parce que j'ai plusieurs modèles d'instructions et je préférerais ne pas avoir plusieurs charges avec des données très similaires si cela pouvait être fait dynamiquement via DAX. Merci!

+0

avez-vous essayé 'NATURALINNERJOIN (, )' https://msdn.microsoft.com/fr-fr/library/dn802543.aspx?f=255&MSPPError=-2147217396 – Horaciux

+0

Aussi, jetez un oeil à ce poste https://www.sqlbi.com/articles/from-sql-to-dax-joining-tables/ – Horaciux

+0

Merci Horaciux, NaturalInnerJoin ne donnera pas le résultat souhaité (vraiment envie d'une jointure à gauche), cela dit, il produit toujours la même erreur. J'ai regardé le lien, mais cela n'avait pas beaucoup de sens - j'espérais que quelqu'un pourrait avoir une solution pour ce scénario. Merci pour la suggestion si !! :) – FirstRedPepper

Répondre

1

Y a-t-il des raisons pour lesquelles la table Template est nécessaire, autre que pour les calculs? Parce que juste à partir des données de l'échantillon, j'ai vu que la table de faits est dupliquée (7 -> 14 lignes) inutilement (peut-être que je manque quelques points clés). Sinon, vous pouvez simplement écrire quelques Measures dans DAX pour faire les calculs dans Power BI (qui est exactement la puissance de Power BI), et seulement la table Fact est nécessaire.

DAX:

Chiffre d'affaires:

Revenue = 
CALCULATE(
    SUM('Fact'[Amount]), 
    FILTER(
     'Fact', 
     'Fact'[Amount] > 0 
    ) 
) 

Coût:

Cost = 
CALCULATE(
    SUM('Fact'[Amount]), 
    FILTER(
     'Fact', 
     'Fact'[Amount] < 0 
    ) 
) 

Bénéfice:

Profit = [Revenue] + [Cost] 

Ensuite, vous pouvez utiliser une visualisation Matrix pour obtenir les résultats souhaités:

result

post-scriptum Si vous avez vraiment besoin que le Revenu/Coût/Bénéfice soit dans la ligne au lieu de la colonne, vous devrez peut-être faire pivoter les données ou écrire les calculs comme nouveaux Column (mais pas Measure) à la place. Cela est dû à un product limitation dans Power BI.

+0

Merci Foxan. Oui, besoin des calculs dans une rangée. C'est fait en utilisant une table de modèles car il y a des centaines de modèles de rapports déjà créés. – FirstRedPepper