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 :

sous-total conditionnel pour chaque groupe dans la clause group by


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2010
    Messages : 21
    Points : 20
    Points
    20
    Par défaut sous-total conditionnel pour chaque groupe dans la clause group by
    Bonsoir à tous, j'ai une petite question pour voir si il est possible de faire une amélioration sur ce que j'ai fait (et j'en suis certain vu les experts ici).

    J'ai la table suivante qui est la simplification d'une partie de requêtes SQL:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    City, Company, number1, number2
    Bordeaux, Toto, 10, 1
    Bordeaux, Toto2, 2, 5
    Ce que je souhaite faire, c'est ajouter une sorte de sous-total conditionnel, en pratique, je veux ajouter pour chaque ville, un sous-total qui est la somme pour chaque entreprise des nombres qui sont inférieur à trois, en pratique le résultat que je souhaite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Bordeaux, Toto, 10, 1
    Bordeaux, Toto2, 2, 5
    Bordeaux, total, 2, 1

    Voila ce que j'ai pensé:

    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
    WITH TT AS
    (
    SELECT 'Bordeaux' City,'Toto' Company, 10 number1, 1 number2 FROM dual union ALL
    SELECT 'Bordeaux','Toto2', 2,5   FROM dual 
    )
    select city,company, sum(test1),sum(test2)
    from
    (
    select city,decode(company,company,'total') as company, sum(case when number1 < 3 and number1 <>0 then number1 else 0 end) as test1, sum(case when number2 < 3 and number2 <>0 then number2 else 0 end) as test2
    from tt
    group by city,company
    UNION
    select * from tt
    )
    group by city, company;
    Ca a l'air de marcher, mais je pense pas avoir trouvé la solution la plus simple, peut-être avez vous une meilleure idée ?

    De plus, quand j'ai une somme de 0 pour number1 et number2, je souhaiterais ne pas voir cette ligne "total", sauriez-vous comment faire ?

    Merci d'avance.

  2. #2
    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 814
    Points
    17 814
    Par défaut
    Pas de gros problème de fond, quelques simplifications sont possibles.
    Regardez ce decode, dites-moi à quoi sert-il :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    decode(company, company, 'total')
    En faites vous écrivez : si company = company alors total.
    Autant écrire total directement, vous économisez ainsi l'utilisation de la colonne company dans le GROUP BY qui vous obligeait à un niveau d'aggrégat supplémentaire.

    Dans vos formules pour la somme vous prenez bien soin d'exclure les valeurs 0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    case when number1 < 3 AND number1 <> 0 then number1 else 0 end
    Mais pourtant, tout ce qui ne rempli pas la condition vaudra 0.
    Vous excluez donc 0 pour lui attribuer la valeur 0 dans le else, c'est donc inutile !

    Utilisez aussi UNION ALL pour rajouter une ligne.
    UNION effectue un distinct supplémentaire, qui n'est pas nécessaire dans votre cas.

    Au final, votre requête s'écrit ainsi :
    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
    with tt as
    (
    select 'Bordeaux' as city, 'Toto' as company, 10 as number1, 1 as number2 from dual union all
    select 'Bordeaux'        , 'Toto2'          ,  2           , 5            from dual 
    )
      select city, company, number1, number2
        from tt
       union all
      select city, 'total',
             sum(case when number1 < 3 then number1 else 0 end),
             sum(case when number2 < 3 then number2 else 0 end)
        from tt
    group by city;
     
    CITY		COMPANY	NUMBER1	NUMBER2
    Bordeaux	Toto	10	1
    Bordeaux	Toto2	2	5
    Bordeaux	total	2	1

  3. #3
    Membre à l'essai
    Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2010
    Messages : 21
    Points : 20
    Points
    20
    Par défaut
    Bonsoir,

    Excusez-moi pour le retard de la réponse, en effet j'ai fait ma requête un peu (trop) rapidement...
    Vous avez raison sur les points cités, cela parait évident après relecture !

    Merci bien !

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

Discussions similaires

  1. [ZF 1.11] require_once ' ' pour chaque fichier dans mon models
    Par absot dans le forum Zend Framework
    Réponses: 3
    Dernier message: 09/02/2012, 14h29
  2. [AC-2003] nbre de ligne pour chaque page dans un etat
    Par akrimi08 dans le forum IHM
    Réponses: 5
    Dernier message: 07/04/2010, 11h38
  3. [MySQL] boucle pour chaque entrée dans un champ
    Par boubourse92 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 28/11/2008, 02h52
  4. Réponses: 1
    Dernier message: 03/07/2007, 17h04
  5. [VB.NET] Taille differente pour chaque colonne dans DATAGRID
    Par stephane93fr dans le forum Windows Forms
    Réponses: 14
    Dernier message: 12/01/2005, 17h50

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