4D v16

Utiliser la clause HAVING

Accueil

 
4D v16
Utiliser la clause HAVING

Utiliser la clause HAVING  


 

 

Nous souhaitons obtenir le nombre total d'entrées depuis 1979 classé par année mais en excluant les films totalisant à eux seuls plus de 10 millions d'entrées.
Pour cela, nous devons cumuler le nombre d'entrée de chaque film depuis 1979, enlever les entrées de ceux qui ont fait plus de 10 000 000 entrées puis trier le résultat par année.
Voici le code 4D correspondant à cette requête :

 TABLEAU ENTIER(aMovieYear;0)
 TABLEAU ENTIER LONG(aSoldTickets;0)
 C_ENTIER LONG($MovieYear;$vCrtMovieYear;$i;$MinSoldTickets;$vInd)
 
 REDUIRE SELECTION([MOVIES];0)
 $MovieYear:=1979
 $MinSoldTickets:=10000000
 CHERCHER([MOVIES];[MOVIES]Year_of_Movie>=$MovieYear)
 TRIER([MOVIES];[MOVIES]Year_of_Movie;>)
 $vCrtMovieYear:=0
 $vInd:=Taille tableau(aMovieYear)
 Boucle($i;1;Enregistrements trouves([MOVIES]))
    Si([MOVIES]Year_of_Movie#$vCrtMovieYear)
       $vCrtMovieYear:=[MOVIES]Year_of_Movie
       Si(aSoldTickets{$vInd}<$MinSoldTickets)
          $vInd:=$vInd+1
          INSERER DANS TABLEAU(aMovieYear;$vInd;1)
          aMovieYear{$vInd}:=$vCrtMovieYear
          INSERER DANS TABLEAU(aSoldTickets;$vInd;1)
       Sinon
          aSoldTickets{$vInd}:=0
       Fin de si
    Fin de si
    aSoldTickets{$vInd}:=aSoldTickets{$vInd}+[MOVIES]Sold_Tickets
    ENREGISTREMENT SUIVANT([MOVIES])
 Fin de boucle
 Si(aSoldTickets{$vInd}>=$MinSoldTickets)
    SUPPRIMER DANS TABLEAU(aSoldTickets;$vInd;1)
    SUPPRIMER DANS TABLEAU(aMovieYear;$vInd;1)
 Fin de si
  ` Initialisation du reste des colonnes de list box pour visualiser l'information
 TABLEAU TEXTE(aTitles;Taille tableau(aMovieYear))
 TABLEAU TEXTE(aDirectors;Taille tableau(aMovieYear))
 TABLEAU TEXTE(aMedias;Taille tableau(aMovieYear))
 TABLEAU ENTIER LONG(aNrActors;Taille tableau(aMovieYear))

  • En utilisant du code SQL :

     TABLEAU ENTIER(aMovieYear;0)
     TABLEAU ENTIER LONG(aSoldTickets;0)
     C_ENTIER LONG($MovieYear;$MinSoldTickets)
     
     $MovieYear:=1979
     $MinSoldTickets:=10000000
     Debut SQL
        SELECT Year_of_Movie, SUM(Sold_Tickets)
        FROM MOVIES
        WHERE Year_of_Movie >= :$MovieYear
        GROUP BY Year_of_Movie
        HAVING SUM(Sold_Tickets) < :$MinSoldTickets
        ORDER BY 1
        INTO :aMovieYear,  :aSoldTickets;
     Fin SQL
      ` Initialisation du reste des colonnes de list box pour visualiser l'information
     TABLEAU TEXTE(aTitles;Taille tableau(aMovieYear))
     TABLEAU TEXTE(aDirectors;Taille tableau(aMovieYear))
     TABLEAU TEXTE(aMedias;Taille tableau(aMovieYear))
     TABLEAU ENTIER LONG(aNrActors;Taille tableau(aMovieYear))
  • En utilisant les commandes SQL génériques :

     C_TEXTE($tQueryTxt)
     TABLEAU ENTIER(aMovieYear;0)
     TABLEAU ENTIER LONG(aSoldTickets;0)
     C_ENTIER LONG($MovieYear;$MinSoldTickets)
     
     $MovieYear:=1979
     $MinSoldTickets:=10000000
     SQL LOGIN(SQL_INTERNAL;"";"")
     $tQueryTxt:=""
     $tQueryTxt:=$tQueryTxt+"SELECT Year_of_Movie, SUM(Sold_Tickets)"
     $tQueryTxt:=$tQueryTxt+" FROM MOVIES"
     $tQueryTxt:=$tQueryTxt+" WHERE Year_of_Movie >= :$MovieYear"
     $tQueryTxt:=$tQueryTxt+" GROUP BY Year_of_Movie"
     $tQueryTxt:=$tQueryTxt+" HAVING SUM(Sold_Tickets) < :$MinSoldTickets"
     $tQueryTxt:=$tQueryTxt+" ORDER BY 1"
     SQL EXECUTER($tQueryTxt;aMovieYear;aSoldTickets)
     SQL CHARGER ENREGISTREMENT(SQL tous les enregistrements)
     SQL LOGOUT
      ` Initialisation du reste des colonnes de list box pour visualiser l'information
     TABLEAU TEXTE(aTitles;Taille tableau(aMovieYear))
     TABLEAU TEXTE(aDirectors;Taille tableau(aMovieYear))
     TABLEAU TEXTE(aMedias;Taille tableau(aMovieYear))
     TABLEAU ENTIER LONG(aNrActors;Taille tableau(aMovieYear))
  • En utilisant la commande CHERCHER PAR SQL :

     C_TEXTE($tQueryTxt)
     TABLEAU ENTIER(aMovieYear;0)
     TABLEAU ENTIER LONG(aSoldTickets;0)
     C_ENTIER LONG($MovieYear;$MinSoldTickets;$vCrtMovieYear;$vInd;$i)
     
     REDUIRE SELECTION([MOVIES];0)
     $MovieYear:=1979
     $MinSoldTickets:=10000000
     CHERCHER PAR SQL([MOVIES];"Year_of_Movie >= :$MovieYear")
     TRIER([MOVIES];[MOVIES]Year_of_Movie;>)
     $vCrtMovieYear:=0
     $vInd:=Taille tableau(aMovieYear)
     Boucle($i;1;Enregistrements trouves([MOVIES]))
        Si([MOVIES]Year_of_Movie#$vCrtMovieYear)
           $vCrtMovieYear:=[MOVIES]Year_of_Movie
           Si(aSoldTickets{$vInd}<$MinSoldTickets)
              $vInd:=$vInd+1
              INSERER DANS TABLEAU(aMovieYear;$vInd;1)
              aMovieYear{$vInd}:=$vCrtMovieYear
              INSERER DANS TABLEAU(aSoldTickets;$vInd;1)
           Sinon
              aSoldTickets{$vInd}:=0
           Fin de si
        Fin de si
        aSoldTickets{$vInd}:=aSoldTickets{$vInd}+[MOVIES]Sold_Tickets
        ENREGISTREMENT SUIVANT([MOVIES])
     Fin de boucle
     Si(aSoldTickets{$vInd}>=$MinSoldTickets)
        SUPPRIMER DANS TABLEAU(aSoldTickets;$vInd;1)
        SUPPRIMER DANS TABLEAU(aMovieYear;$vInd;1)
     Fin de si
      ` Initialisation du reste des colonnes de list box pour visualiser l'information
     TABLEAU TEXTE(aTitles;Taille tableau(aMovieYear))
     TABLEAU TEXTE(aDirectors;Taille tableau(aMovieYear))
     TABLEAU TEXTE(aMedias;Taille tableau(aMovieYear))
     TABLEAU ENTIER LONG(aNrActors;Taille tableau(aMovieYear))
  • En utilisant la commande SQL dynamique EXECUTE IMMEDIATE :

     C_TEXTE($tQueryTxt)
     TABLEAU ENTIER(aMovieYear;0)
     TABLEAU ENTIER LONG(aSoldTickets;0)
     C_ENTIER LONG($MovieYear;$MinSoldTickets)
     
     $MovieYear:=1979
     $MinSoldTickets:=10000000
     $tQueryTxt:=""
     $tQueryTxt:=$tQueryTxt+"SELECT Year_of_Movie, SUM(Sold_Tickets)"
     $tQueryTxt:=$tQueryTxt+" FROM MOVIES"
     $tQueryTxt:=$tQueryTxt+" WHERE Year_of_Movie >= :$MovieYear"
     $tQueryTxt:=$tQueryTxt+" GROUP BY Year_of_Movie"
     $tQueryTxt:=$tQueryTxt+" HAVING SUM(Sold_Tickets) < :$MinSoldTickets"
     $tQueryTxt:=$tQueryTxt+" ORDER BY 1"
     $tQueryTxt:=$tQueryTxt+" INTO :aMovieYear, :aSoldTickets;"
     Debut SQL
        EXECUTE IMMEDIATE :$tQueryTxt;
     Fin SQL
      ` Initialisation du reste des colonnes de list box pour visualiser l'information
     TABLEAU TEXTE(aTitles;Taille tableau(aMovieYear))
     TABLEAU TEXTE(aDirectors;Taille tableau(aMovieYear))
     TABLEAU TEXTE(aMedias;Taille tableau(aMovieYear))
     TABLEAU ENTIER LONG(aNrActors;Taille tableau(aMovieYear))

Pour tester ces exemples, lancez la base "4D SQL Code Samples" et affichez la boîte de dialogue principale. Choisissez le mode d'interrogation du moteur de 4D et cliquez sur le bouton Clause HAVING.

 
PROPRIÉTÉS 

Produit : 4D
Thème : Prise en main
Nom intl. : Using the HAVING clause

 
HISTORIQUE 

 
UTILISATION DE L'ARTICLE

4D - Référence SQL ( 4D v16)