IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Filtre de paramètre dans requête avec sous-requêtes


Sujet :

Langage SQL

  1. #1
    Membre régulier Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 94
    Points
    94
    Par défaut Filtre de paramètre dans requête avec sous-requêtes
    Bjr.

    J'ai deux tables (HSQLDB) dans lesquelles sont saisies les représentants et leur chiffre d'affaires mensuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    CREATE TABLE T_REPRESENTANTS (
    	REP_ID INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) NOT NULL,
    	REP_NOM VARCHAR(32) NOT NULL,
    	REP_PRENOM VARCHAR(32) NOT NULL,
    	CONSTRAINT PK_REP_ID PRIMARY KEY (REP_ID)
    );
     
    CREATE TABLE T_VENTES (
    	VEN_ID INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) NOT NULL,
    	REP_ID INTEGER NOT NULL,
    	VEN_DATE DATE NOT NULL,	-- Date du dernier jour du mois
    	VEN_MNT DECIMAL(10,2) DEFAULT 0 NOT NULL,
    	CONSTRAINT PK_VEN_ID PRIMARY KEY (VEN_ID),
    	CONSTRAINT FK_VEN_REP FOREIGN KEY (REP_ID) REFERENCES T_REPRESENTANTS (REP_ID),
    	CONSTRAINT UC_REP_DATE UNIQUE (REP_ID, VEN_DATE)
    );
    Après tâtonnements, j'ai créé cette requête qui permet d'afficher les données sous forme tabulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    SELECT REP_NOM || ' ' || REP_PRENOM AS REPRESENTANT,
    (SELECT SUM(T_VENTES.VEN_MNT) FROM T_VENTES WHERE T_VENTES.REP_ID = T_REPRESENTANTS.REP_ID AND MONTH(T_VENTES.VEN_DATE) = 1) AS JAN,
    (SELECT SUM(T_VENTES.VEN_MNT) FROM T_VENTES WHERE T_VENTES.REP_ID = T_REPRESENTANTS.REP_ID AND MONTH(T_VENTES.VEN_DATE) = 2) AS FEV,
    (SELECT SUM(T_VENTES.VEN_MNT) FROM T_VENTES WHERE T_VENTES.REP_ID = T_REPRESENTANTS.REP_ID AND MONTH(T_VENTES.VEN_DATE) = 3) AS MAR,
    (SELECT SUM(T_VENTES.VEN_MNT) FROM T_VENTES WHERE T_VENTES.REP_ID = T_REPRESENTANTS.REP_ID AND MONTH(T_VENTES.VEN_DATE) = 4) AS AVR,
    (SELECT SUM(T_VENTES.VEN_MNT) FROM T_VENTES WHERE T_VENTES.REP_ID = T_REPRESENTANTS.REP_ID AND MONTH(T_VENTES.VEN_DATE) = 5) AS MAI,
    (SELECT SUM(T_VENTES.VEN_MNT) FROM T_VENTES WHERE T_VENTES.REP_ID = T_REPRESENTANTS.REP_ID AND MONTH(T_VENTES.VEN_DATE) = 6) AS JUI,
    (SELECT SUM(T_VENTES.VEN_MNT) FROM T_VENTES WHERE T_VENTES.REP_ID = T_REPRESENTANTS.REP_ID AND MONTH(T_VENTES.VEN_DATE) = 7) AS JUL,
    (SELECT SUM(T_VENTES.VEN_MNT) FROM T_VENTES WHERE T_VENTES.REP_ID = T_REPRESENTANTS.REP_ID AND MONTH(T_VENTES.VEN_DATE) = 8) AS AOU,
    (SELECT SUM(T_VENTES.VEN_MNT) FROM T_VENTES WHERE T_VENTES.REP_ID = T_REPRESENTANTS.REP_ID AND MONTH(T_VENTES.VEN_DATE) = 9) AS SEP,
    (SELECT SUM(T_VENTES.VEN_MNT) FROM T_VENTES WHERE T_VENTES.REP_ID = T_REPRESENTANTS.REP_ID AND MONTH(T_VENTES.VEN_DATE) = 10) AS OCT,
    (SELECT SUM(T_VENTES.VEN_MNT) FROM T_VENTES WHERE T_VENTES.REP_ID = T_REPRESENTANTS.REP_ID AND MONTH(T_VENTES.VEN_DATE) = 11) AS NOV,
    (SELECT SUM(T_VENTES.VEN_MNT) FROM T_VENTES WHERE T_VENTES.REP_ID = T_REPRESENTANTS.REP_ID AND MONTH(T_VENTES.VEN_DATE) = 12) AS DEC,
    (SELECT SUM(T_VENTES.VEN_MNT)
    FROM T_VENTES
    WHERE T_VENTES.REP_ID = T_REPRESENTANTS.REP_ID) AS TOTAL
    FROM T_REPRESENTANTS
    ORDER BY T_REPRESENTANTS.REP_NOM ASC
    Je voudrais intégrer dans cette requête un filtre de paramètre pour l'année et je ne parviens pas à le faire.

    Vous en remerciant...

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Tu peux largement simplifier ta requête:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT REP_NOM || ' ' || REP_PRENOM AS REPRESENTANT,
    sum(case when MONTH(T_VENTES.VEN_DATE) = 1 then T_VENTES.VEN_MNT else 0 end) as jan,
    sum(case when MONTH(T_VENTES.VEN_DATE) = 2 then T_VENTES.VEN_MNT else 0 end) as fev,
    ...
    from T_REPRESENTANTS
    inner join T_VENTES 
    on T_VENTES.REP_ID = T_REPRESENTANTS.REP_ID
    group by REP_NOM,REP_PRENOM AS REPRESENTANT

    La requête sera sans aucun doute bien plus performante, et l'ajout d'un filtre sur l'année devient trivial.

    Tatayo.

  3. #3
    Membre régulier Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 94
    Points
    94
    Par défaut
    Et oui, une jointure au lieu de 13 sous-requêtes... Merci...

    Las clauses WHERE et ORDER BY sont intégrées mais j'ai encore un petit problème. Pour que cette requête soit complète, il faut également le total par colonne. Je ne sais vraiment pas si ça peut s'intégrer dans cette requête, alors pour l'instant, je l'enregistre sous forme de vue nommée V_VENTES (en tant que requête, la suivante ne fonctionne pas) et j'obtiens la somme des colonnes avec celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    SELECT * FROM V_VENTES
    UNION
    SELECT 'TOTAL',
    SUM(JAN) AS JAN,
    SUM(FEV) AS FEV,
    SUM(MAR) AS MAR,
    SUM(AVR) AS AVR,
    SUM(MAI) AS MAI,
    SUM(JUI) AS JUI,
    SUM(JUL) AS JUL,
    SUM(AOU) AS AOU,
    SUM(SEP) AS SEP,
    SUM(OCT) AS OCT,
    SUM(NOV) AS NOV,
    SUM(DEC) AS DEC,
    SUM(TOTAL) AS TOTAL
    FROM V_VENTES
    C'est au niveau de l'ordre que ça coince. La ligne TOTAL est également classée par ordre alphabétique, parmi les représentants.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Bonjour,

    Ce genre de problème peut-être résolu en ajoutant une colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    SELECT  1   AS  ORDRE
        ,   * 
    FROM V_VENTES
    UNION
    SELECT  2   AS  ORDRE
        ,   'TOTAL'
        ,   SUM(JAN) AS JAN
        ,   SUM(FEV) AS FEV
        ,   SUM(MAR) AS MAR
        ,   SUM(AVR) AS AVR
        ,   SUM(MAI) AS MAI
        ,   SUM(JUI) AS JUI
        ,   SUM(JUL) AS JUL
        ,   SUM(AOU) AS AOU
        ,   SUM(SEP) AS SEP
        ,   SUM(OCT) AS OCT
        ,   SUM(NOV) AS NOV
        ,   SUM(DEC) AS DEC
        ,   SUM(TOTAL) AS TOTAL
    FROM    V_VENTES
    ORDER BY ORDRE
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre régulier Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 94
    Points
    94
    Par défaut
    Ok et en ajoutant REPRESENTANT au ORDER BY, on obtient le résultat escompté.

    Merci.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il y a encore mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      select case grouping(REP_NOM || ' ' || REP_PRENOM when 1 then 'Total' else REP_NOM || ' ' || REP_PRENOM end as REPRESENTANT
           , sum(case when month(T_VENTES.VEN_DATE) = 1 then T_VENTES.VEN_MNT else 0 end) as jan
           , sum(case when month(T_VENTES.VEN_DATE) = 2 then T_VENTES.VEN_MNT else 0 end) as fev
           , ...
        from T_REPRESENTANTS
        join T_VENTES        on T_VENTES.REP_ID = T_REPRESENTANTS.REP_ID
    group by rollup(REP_NOM || ' ' || REP_PRENOM)
    order by grouping_id()
           , REPRESENTANT;
    J'ai supposé que les fonctions GROUPING & GROUPING_ID existent dans HSQLDB mais je ne les ai pas trouvées dans la doc, il faudra peut-être les remplacer par un coalesce.

  7. #7
    Membre régulier Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 94
    Points
    94
    Par défaut
    Avec coalesce, voici le message d'erreur :

    Nom : copie.png
Affichages : 167
Taille : 57,4 Ko

    J'ai fait une recherche rapide et il semblerait que HSQL ne gère pas le rollup (je n'en avais d'ailleurs moi-même jamais entendu parlé). Je n'ai donc trouvé que cette référence (qui date tout de même de 18 ans) :

    https://sourceforge.net/p/hsqldb/dis...read/498647de/

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    C'est dans la doc au chapitre "GROUP BY" :
    https://hsqldb.org/doc/guide/dataaccess-chapt.html
    Mais oui peut-être ce n'est pas dans la version que vous utilisez.

  9. #9
    Membre régulier Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 94
    Points
    94
    Par défaut
    Effectivement. La documentation dans laquelle je fais des recherches si besoin est n'est pas la même et est beaucoup moins complète (mais j'avoue que je n'ai pas tout scruté) :

    https://wiki.openoffice.org/wiki/FR/...n/HSQLDB_Guide

    Après ça, il est aussi tout à fait possible que ce rollup ne soit pas implémenté dans le HSQLDB de LibreOffice (je sais qu'il y a des différences).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appliquer filtre en cascade dans requête SQL
    Par hisoka123 dans le forum SQL
    Réponses: 7
    Dernier message: 16/05/2022, 12h40
  2. Réponses: 5
    Dernier message: 14/09/2021, 19h02
  3. [2008] Recupération paramètres dans requête
    Par laure07 dans le forum SSRS
    Réponses: 8
    Dernier message: 18/04/2013, 11h17
  4. [WD12] Paramètres dans requêtes
    Par olivierlemaire2009 dans le forum WinDev
    Réponses: 2
    Dernier message: 24/05/2009, 18h53
  5. Requête paramétrée dans un table Adapter avec ACCESS
    Par capitaine dans le forum ASP.NET
    Réponses: 3
    Dernier message: 10/09/2007, 09h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo