2 Replies Latest reply: Mar 28, 2014 4:17 AM by Loïc AXILAIS RSS

    LOAD en cascade avec jointure

      Bonjour

      Je souhaite savoir si il est possible de bénéficier du mécanisme de chargement en cascade pour ajouter un champ calculé sur un ensemble de données résultant d'une jointure.

       

      Objectif : Joindre les tables INDICATEUR, STAT et PERIODE dans une table cible FINAL tout en y ajoutant un champ calculé.

      Problème : le champ calculé « ValeurCalcul » utilise un champ provenant du second LEFT JOIN. QlikView indique qu’il ne connaît pas le champ V2, ça ne fonctionne pas mieux si j’utilise le nom du champ avant son renommage par l’alias (à savoir LenPeriode).

      Question : Existe-t-il un moyen pour ajouter ce champ calculé à la table FINAL sans passer par une table temporaire ?

       

      Voici le script avec en jaune fluo la ligne qui plante. Ce script est juste un cas d’école facile à reproduire. Dans la vraie vie, ma table FINAL contient plusieurs millions de lignes et la dupliquer dans une table temporaire juste pour y ajouter un champ calculé, je ne trouve pas ça très performant …

       

      INDICATEUR:
      LOAD * INLINE [
          CodeIndicateur, NomIndicateur
          1, Connexions
          2, Abonnés distincts
          3, Connexions / Abonné
      ]
      ;

      STAT:
      LOAD * INLINE [
          CodePeriode, CodeIndicateur, Valeur
          201301, 1, 10
          201302, 1, 20
          201303, 1, 30
          201304, 1, 40
          201301, 2, 5
          201302, 2, 10
          201303, 2, 15
          201304, 2, 20
      ]
      ;

      PERIODE:
      LOAD * INLINE [
          CodePeriode, NomPeriode, LenPeriode
          201301, Janvier 2013, 12
          201302, Février 2013, 12
          201303, Mars 2013, 9
          201304, Avril 2013, 10
      ]
      ;

      FINAL:
      NOCONCATENATE LOAD
        *,
        (
      V2 + 1)*V1 as ValeurCalcul;
       
      LOAD
       
      CodePeriode,
       
      CodeIndicateur,
       
      Valeur as V1
      RESIDENT STAT;

      LEFT JOIN (FINAL)
      LOAD
       
      CodeIndicateur,
       
      NomIndicateur
      RESIDENT INDICATEUR;


      LEFT JOIN (FINAL)
      LOAD
       
      CodePeriode,
       
      NomPeriode,
       
      LenPeriode as V2
      RESIDENT PERIODE;

       

      DROP TABLE STAT;
      DROP TABLE INDICATEUR;
      DROP TABLE PERIODE;

        • Re: LOAD en cascade avec jointure
          Massimo Grossi

          I don't have real data so I can't check for performance

          This is just one possibility; if you give me some indication on the numbers of records of the tables I can try to generate data and to compare the two solutions; for now, without knowing anything about this I would choose the one with the apply map

           

           

          MapINDICATEUR:

          Mapping

          LOAD * INLINE [

              CodeIndicateur, NomIndicateur

              1, Connexions

              2, Abonnés distincts

              3, Connexions / Abonné

          ];

           

          STAT:

          LOAD * INLINE [

              CodePeriode, CodeIndicateur, Valeur

              201301, 1, 10

              201302, 1, 20

              201303, 1, 30

              201304, 1, 40

              201301, 2, 5

              201302, 2, 10

              201303, 2, 15

              201304, 2, 20

          ];

           

          PERIODE:

          LOAD * INLINE [

              CodePeriode, NomPeriode, LenPeriode

              201301, Janvier 2013, 12

              201302, Février 2013, 12

              201303, Mars 2013, 9

              201304, Avril 2013, 10

          ];

           

          MapPERIODE1: Mapping load CodePeriode, NomPeriode Resident PERIODE;

          MapPERIODE2: Mapping load CodePeriode, LenPeriode Resident PERIODE;

          DROP Table PERIODE;

           

          FINAL:

          LOAD

            CodePeriode,

            CodeIndicateur,

            Valeur as V1,

            ApplyMap('MapINDICATEUR', CodeIndicateur, 'Missing') as NomIndicateur,

            ApplyMap('MapPERIODE1', CodePeriode, 'Missing') as NomPeriode,

            ApplyMap('MapPERIODE2', CodePeriode, 'Missing') as LenPeriode, 

            (ApplyMap('MapPERIODE2', CodePeriode, 'Missing') +1)* Valeur as ValeurCalcul

          RESIDENT STAT;

           

          DROP TABLE STAT;

            • Re: LOAD en cascade avec jointure

              Thank you for this answer but as I explained, these data are just a sample. My real case is very complex.

              Mapping is a good idea, I keep it in mind but it doesn't solve my problem :

              1) In fact, I join more than 4 tables and my calculated field V2 used numeric fields coming from these 4 tables.

              2) Table STAT contains more than 15 million records and performance could be a problem.

              Regards