8 Replies Latest reply: Jan 14, 2014 10:53 AM by Marwen Garwachi RSS

    Left Join

    Marwen Garwachi

      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

        • Re: Left Join
          Amaury MOREAU

          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

            • Re: Left Join
              Marwen Garwachi

              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

                • Re: Left Join
                  Martin FAVIER

                  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

              • Re: Left Join
                Amaury MOREAU

                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

                • Re: Left Join
                  Marwen Garwachi

                  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.

                    • Re: Left Join
                      Marwen Garwachi

                      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

                    • Re: Left Join
                      Almamy DIABY

                      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