Qlik Community

Groupe des Utilisateurs Francophones

Announcements
Submit your remarkable customer story for the Global Transformation Awards at QlikWorld Denver 2022. SUBMIT A STORY
cancel
Showing results for 
Search instead for 
Did you mean: 
marwen_garwachi
Creator II
Creator II

Left Join

Bonjour,

J'essaie de créer une jointure qui échoue avec un code D à chaque chargement.

J'ai un fichier contenant une liste de dossiers avec plusieurs actions par dossier, mon but est de charger la dernière action de chaque dossier.

Je procède comme suit :

//Je charge le fichier complet

Actions:

LOAD *

FROM

Data\overall_actions\overall_qlikview_actions.200001.csv

(txt, codepage is 1252, embedded labels, delimiter is '|')

Where client_userid ='c0344' and wildmatch(actiontype,'TL*') ;

//je crée une table temporaire avec le numéro de dossier et la date de la dernière action.

Actions_tmp:

load

dossier as tmp_dos,

     max(dte_end) as dte_dern_action

resident Actions group by dossier,dte_start;

// je réalise une jointure des deux tables

left join (Actions_tmp )

load dossier

resident Actions

ça charge...puis j'ai un message d'erreur Code D.

Actions << overall_qlikview_actions.200001 24 159 lignes récupérées

Actions_tmp << Actions 24 087 lignes récupérées

Actions 24 159 lignes récupérées

Quelqu'un peut il me dire ce qui ne va pas ? ou peut être me proposer une optimisation de ma démarche ?

D'avance merci

1 Solution

Accepted Solutions
amauryviseo
Partner
Partner

La jointure sert à relier deux ou plusieurs tables entre elles

Les jointures sur QlikView sont assez proches dans le concept que celles faites avec une base de données relationnelle

La différence au niveau de la syntaxe entre le SQL et QlikView c'est que sur QlikView les clés et les types de jointure ne sont pas renseignées dans un FROM ou dans un WHERE... QlikView considère que les champs de même nom doivent être reliés ensemble, et le type de jointure est précisé avant le LOAD de la deuxième table à relier avec la première

Ensuite comme sur une base de données relationnelle il y a des jointures externes (OUTER JOIN), internes (INNER JOIN), jointures gauche (LEFT JOIN); jointures droite (RIGHT JOIN)

Dans votre cas la question à se poser

-Est ce que je souhaite avoir la date de dernière action dans une table DOSSIERS où il y a une ligne par dossier

Si OUI pas besoin de jointures

Un simple

Dossiers:

Load

dossier,

     max(dte_end) as dte_dern_action

resident Actions

group by dossier

;

suffit

DOSSIERS et ACTIONS vont automatiquement se relier entre elles par le champ "dossier" qui est commun

-Est ce que je souhaite avoir la date de dernière action dans la table ACTIONS où il y a une ligne par dossier et par action et dans ce cas la jointure se justifie pour créer le nouveau champ dte_dern_action dans la table ACTIONS

left join (Actions)

load

dossier,

     max(dte_end) as dte_dern_action

resident Actions

group by dossier;

Sur QlikView, ca peut perturber au départ on peut créer un nouveau champ dans une table "x" en faisant un RESIDENT sur cette même table "x", et même à une granularité différente (dans notre cas on fait un group by)

Le choix des deux possibilités dépend de ce que vous souhaitez faire du champ dte_dern_action. Est ce que c'est fait pour l"utiliser (faire des calculs) avec la date de départ, est ce un simple attribut....Cela dépendra ainsi de la volumétrie, de la profondeur de l'arbre constituant votre modèle de données

Amaury Moreau
Senior BI Consultant - Qlik Expert

View solution in original post

8 Replies
amauryviseo
Partner
Partner

Bonjour Marwen,

Actions_tmp:

load

dossier as tmp_dos,

     max(dte_end) as dte_dern_action

resident Actions group by dossier,dte_start;

Vous demandez un regroupement sur le champ "dte_start" que vous n'utilisez pas ensuite dans le LOAD. Ca n'a pas l'air de gêner QlikView mais est ce vraiment utile ? Car pour le coup celà ne vous prend pas la date de dernière action pour un dossier donné...Il y aura autant de lignes qu'il y a de dte_start différente

Quand au left join même si la syntaxe a l'air bonne (si ce n'est le ";" après le resident Actions) celà créé une jointure avec un produit cartésien ! Le champ "dossier" n'existe plus dans la table "Actions_tmp"

Cette erreur de type "D" arrive quand QlikView fait une erreur interne lors d'un reload. Il n'y a pas de raisons particulières mais celà arrive souvent quand la mémoire est pleine ou sur un système lent ou déjà mis à contribution par d'autres programmes

Dans votre cas le produit cartésien qui créé plusieurs dizaines de millions de lignes doit en être la source

Cordialement

Amaury Moreau
Senior BI Consultant - Qlik Expert
marwen_garwachi
Creator II
Creator II
Author

Bonjour Amaury,

Tout ce dont j'ai besoin c'est d'avoir une table avec, pour chaque dossier, la dernière action réalisée (une action par dossier).

Quelle serait la meilleure formule à utiliser pour réaliser une jointure basée sur le numéro de dossier ?

Je ne comprend pas très bien la syntaxe des jointures sur Qlikview  .

D'avance merci.

Marwen

martin59
Specialist II
Specialist II

Bonjour Marwen,

Je n'ai pas lu votre problème en détail, mais j'ai posté hier soir une application qui présente les résultats des différentes jointures. Peut-être que celle-ci pourra vous être utile !

Martin Favier

amauryviseo
Partner
Partner

La jointure sert à relier deux ou plusieurs tables entre elles

Les jointures sur QlikView sont assez proches dans le concept que celles faites avec une base de données relationnelle

La différence au niveau de la syntaxe entre le SQL et QlikView c'est que sur QlikView les clés et les types de jointure ne sont pas renseignées dans un FROM ou dans un WHERE... QlikView considère que les champs de même nom doivent être reliés ensemble, et le type de jointure est précisé avant le LOAD de la deuxième table à relier avec la première

Ensuite comme sur une base de données relationnelle il y a des jointures externes (OUTER JOIN), internes (INNER JOIN), jointures gauche (LEFT JOIN); jointures droite (RIGHT JOIN)

Dans votre cas la question à se poser

-Est ce que je souhaite avoir la date de dernière action dans une table DOSSIERS où il y a une ligne par dossier

Si OUI pas besoin de jointures

Un simple

Dossiers:

Load

dossier,

     max(dte_end) as dte_dern_action

resident Actions

group by dossier

;

suffit

DOSSIERS et ACTIONS vont automatiquement se relier entre elles par le champ "dossier" qui est commun

-Est ce que je souhaite avoir la date de dernière action dans la table ACTIONS où il y a une ligne par dossier et par action et dans ce cas la jointure se justifie pour créer le nouveau champ dte_dern_action dans la table ACTIONS

left join (Actions)

load

dossier,

     max(dte_end) as dte_dern_action

resident Actions

group by dossier;

Sur QlikView, ca peut perturber au départ on peut créer un nouveau champ dans une table "x" en faisant un RESIDENT sur cette même table "x", et même à une granularité différente (dans notre cas on fait un group by)

Le choix des deux possibilités dépend de ce que vous souhaitez faire du champ dte_dern_action. Est ce que c'est fait pour l"utiliser (faire des calculs) avec la date de départ, est ce un simple attribut....Cela dépendra ainsi de la volumétrie, de la profondeur de l'arbre constituant votre modèle de données

Amaury Moreau
Senior BI Consultant - Qlik Expert

View solution in original post

marwen_garwachi
Creator II
Creator II
Author

Pour vous mettre un peu dans le bain :

Je travaille sur un Dashboard qui affiche plusieurs types de données (facturation,clientèle,état des dossiers,etc)

Il y'a plusieurs chargements de millions de lignes avant d'arriver à cette étape.

Je souhaite ajouter la dernière action entreprise dans chaque dossier ainsi que sa date d'échéance (dte_dern_action + 15j). Pour ce faire, je dois d'abord charger une table avec :

Dossier (qui servira de clé pour joindre la présente table au reste des données),dte_dern_action,Action_name

Dans un premier temps, mon problème c'est que je n'arrive pas à avoir une ligne par dossier compte tenu du fait qu'il y'en y'a parfois des centaines par dossier.

Une fois que c'est fait, je dois encore relier cette table à l'ensemble des données.

marwen_garwachi
Creator II
Creator II
Author

Finalement j'ai réussi à atteindre (avec plus ou moins de précision) mon objectif avec ce script :

Actions:

LOAD *

FROM

Data\overall_actions\overall_qlikview_actions.200001.csv

(txt, codepage is 1252, embedded labels, delimiter is '|')

where client_userid= 'c0344';

Temp_Action:

Load

dossier,

     max(dte_end) as dte_end

resident Actions

group by dossier ;

inner join (Temp_Action)

load distinct(dossier),dte_end,actionfr

resident Actions ;

drop table Actions

rename table Temp_Action to Actions

almamy_diaby
Creator
Creator

Je pense que en mettant Noconcatenate  après le chargement de la table Actions permettra de te donner le meilleur résultat.

Actions:

LOAD *

FROM

Data\overall_actions\overall_qlikview_actions.200001.csv

(txt, codepage is 1252, embedded labels, delimiter is '|')

where client_userid= 'c0344';

Noconcatenate

Temp_Action:

Load

dossier,

     max(dte_end) as dte_end

resident Actions

group by dossier ;

inner join (Temp_Action)

load

distinct(dossier),dte_end,actionfr

resident Actions ;

drop table Actions;

rename table Temp_Action to Actions

marwen_garwachi
Creator II
Creator II
Author

En effet

Merci !