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 :

Peut-on faire une totalisation par colonne avec SQL ?


Sujet :

Langage SQL

  1. #1
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut Peut-on faire une totalisation par colonne avec SQL ?
    Bonjour,

    J'ai une requête avec 5 colonnes et une totalisation en bout de ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT SUM(maj_pts_logement) as "Logement", SUM(maj_pts_personne) as "Personne", SUM(maj_pts_gestion) as "Gestion", SUM(maj_pts_temps) as "Temps", SUM(maj_pts_new_dossier) as "Nouveau", SUM(maj_pts_hors_norme) as "Hors Norme", SUM(maj_pts_logement+maj_pts_personne+maj_pts_gestion+maj_pts_temps+maj_pts_new_dossier+maj_pts_hors_norme) as "Cumul des points"
    FROM $file
    GROUP BY id_maj
    Et elle fonctionne très bien.

    Ma question est celle-ci :

    Peut-on faire une totalisation par colonne SQL?

    Merci d'avance

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 64
    Points : 75
    Points
    75
    Par défaut SQL pour totalisation
    Bonsoir,


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT SUM(maj_pts_logement) as "Logement", SUM(maj_pts_personne) as "Personne", SUM(maj_pts_gestion) as "Gestion", SUM(maj_pts_temps) as "Temps", SUM(maj_pts_new_dossier) as "Nouveau", SUM(maj_pts_hors_norme) as "Hors Norme", SUM(maj_pts_logement+maj_pts_personne+maj_pts_gestion+maj_pts_temps+maj_pts_new_dossier+maj_pts_hors_norme) as "Cumul des points"
    FROM $file
    GROUP BY id_maj
    Je ferais ceci pour résoudre ton problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT SUM(maj_pts_logement) as "Logement", SUM(maj_pts_personne) as "Personne", SUM(maj_pts_gestion) as "Gestion", SUM(maj_pts_temps) as "Temps", SUM(maj_pts_new_dossier) as "Nouveau", SUM(maj_pts_hors_norme) as "Hors Norme", SUM(maj_pts_logement+maj_pts_personne+maj_pts_gestion+maj_pts_temps+maj_pts_new_dossier+maj_pts_hors_norme) as "Cumul des points"
    FROM $file
    GROUP BY id_maj
    UNION
    SELECT SUM(maj_pts_logement) as "Logement", SUM(maj_pts_personne) as "Personne", SUM(maj_pts_gestion) as "Gestion", SUM(maj_pts_temps) as "Temps", SUM(maj_pts_new_dossier) as "Nouveau", SUM(maj_pts_hors_norme) as "Hors Norme", SUM(maj_pts_logement+maj_pts_personne+maj_pts_gestion+maj_pts_temps+maj_pts_new_dossier+maj_pts_hors_norme) as "Cumul des points"
    FROM $file
    Bonne chance

    Fred

  3. #3
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Citation Envoyé par fred_crrm
    Bonsoir,

    ....
    Je ferais ceci pour résoudre ton problème :
    ...
    Merci Fred,

    Veux-tu dire que ce que tu me présente me permet de faire un total par colonne ?

    Ou as-tu vu un problème dans ce que j'avais mis ?

    Avec ta requête, j'ai 160 lignes, avec la mienne, j'ai 1750 lignes et c'est ce que je veux. Alors y a sûrement quelques choses que je n'ai pas compris.

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Personnellement, je ne vois pas ce que vous entendez par total par colonne mais si vous nous donnez un exemple minimal avec le résultat attendu alors j'y verrai sûrement plus clair

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 64
    Points : 75
    Points
    75
    Par défaut Somme totale en SQL
    salut,

    Quand tu lances ta requète avec ton Group By, tu obtiens un certain nombre d'enregistrements.
    Avec le UNION et la 2ème partie de la requète que j'ai ajouté dans mon exemple, tu auras une ligne de plus avec le total des colonnes.

    J'espère que tu comprends mieux avec cette explication

    Fred

  6. #6
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Citation Envoyé par fred_crrm
    salut,

    Quand tu lances ta requète avec ton Group By, tu obtiens un certain nombre d'enregistrements.
    Avec le UNION et la 2ème partie de la requète que j'ai ajouté dans mon exemple, tu auras une ligne de plus avec le total des colonnes.

    J'espère que tu comprends mieux avec cette explication

    Fred
    Oui cela fonctionne bien, mais pas très bien.

    Bon, j'ai bien mon total, mais "avec ta requête, j'ai 160 lignes, avec la mienne, j'ai 1750 lignes et c'est ce que je veux. Alors y a sûrement quelques choses que je n'ai pas compris.

    Il y a bien 1750 "id_maj" différents donc ce n'est pas le "group by" qui me joue des tours

  7. #7
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Citation Envoyé par Magnus
    Personnellement, je ne vois pas ce que vous entendez par total par colonne mais si vous nous donnez un exemple minimal avec le résultat attendu alors j'y verrai sûrement plus clair
    Bonjour Magnus,

    Lors d'une requête sql, on récupère des lignes d'enregistrements et chaque champ correspond à une colonne d'une table décrite dans la base de données.

    Si je dit que j'ai une colonne "montant" de type decimal(7,2) par exemple et que je veux le total de cette colonne, cela veut dire que je veux le total des "montant" de la table. Donc le total de la colonne "montant".

    Mais peut-être que je n'emploie pas le bon vocabulaire, dans phpmyadmin on défini des champs pas des colonnes.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 64
    Points : 75
    Points
    75
    Par défaut Somme totale en SQL
    effectivement, tu devrais avoir 1751 enregs, je comprends pas pourquoi tu en a que 160.

  9. #9
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 398
    Points : 641
    Points
    641
    Par défaut
    Et en mettant UNION ALL (UNION seul supprime les doublons il me semble)...

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 64
    Points : 75
    Points
    75
    Par défaut Union All
    Effectivement, le UNION ALL n'élimine pas les doublons contrairement à l'UNION seul. sachant que ce contrôle se fait sur toute les zones, dont la clé.
    Dans ce cas, le Group by sur la clé ne crée pas de doublons, donc UNION ALL n'est semble-t-il pas utile.

    Mais pourtant, le résultat semble incorrect, alors QUID ????

  11. #11
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 398
    Points : 641
    Points
    641
    Par défaut
    Pas d'accord avec ton raisonnement Fred, le UNION élimine les doublons de la projection, pas les doublons de la clé...
    Dans cet exemple, la clé ne se trouvant pas dans la projection (select....), mais uniquement dans le group by, si les cumuls sont identiques pour certaines clés, les lignes correspondantes ne seront affichées qu'une fois.

  12. #12
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Citation Envoyé par lper
    Et en mettant UNION ALL (UNION seul supprime les doublons il me semble)...
    Oui c'est beaucoup mieux, avec UNION ALL j'ai tous mes enregistrements.

    Si j'ai bien compris il suffit de faire une requête A, ajouter à la fin UNION (ou UNION ALL en fonction de ce que l'on veut) et de copier la requête A (que j'appelerai A'). A et A' doivent être identique ?

  13. #13
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 398
    Points : 641
    Points
    641
    Par défaut
    Voici un lien (écrit par notre maitre à tous) qui permettra de comprendre et d'enrichir tes connaissances SQL :

    http://sqlpro.developpez.com/cours/sqlaz/ensembles/

  14. #14
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Lecture très intéressante pour cette requête et pour d'autres à venir.

    Donc cette requête fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT SUM(maj_pts_logement) AS "Logement", SUM(maj_pts_personne) AS "Personne", SUM(maj_pts_gestion) AS "Gestion", SUM(maj_pts_temps) AS "Temps", SUM(maj_pts_new_dossier) AS "Nouveau", SUM(maj_pts_hors_norme) AS "Hors Norme", SUM(maj_pts_logement+maj_pts_personne+maj_pts_gestion+maj_pts_temps+maj_pts_new_dossier+maj_pts_hors_norme) AS "Cumul des points"
    FROM $file
    GROUP BY id_maj
    UNION ALL
    SELECT SUM(maj_pts_logement) AS "Logement", SUM(maj_pts_personne) AS "Personne", SUM(maj_pts_gestion) AS "Gestion", SUM(maj_pts_temps) AS "Temps", SUM(maj_pts_new_dossier) AS "Nouveau", SUM(maj_pts_hors_norme) AS "Hors Norme", SUM(maj_pts_logement+maj_pts_personne+maj_pts_gestion+maj_pts_temps+maj_pts_new_dossier+maj_pts_hors_norme) AS "Cumul des points"
    FROM $file
    Mais c'est un extrait de la réalité.

    Ma requête terminée donne ceci :
    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
    22
    23
    24
    25
    26
    SELECT CONCAT(user_nom, user_prenom) as 'Délégué', maj_num_dos as "Dossier", maj_nom as "Nom", maj_prenom as "Prénom", maj_pts_logement as "Logement", maj_pts_personne as "Personne", maj_pts_gestion as "Gestion", maj_pts_temps as "Temps", maj_pts_new_dossier as "Nouveau", maj_pts_hors_norme as "Hors Norme", SUM(maj_pts_logement+maj_pts_personne+maj_pts_gestion+maj_pts_temps+maj_pts_new_dossier+maj_pts_hors_norme) as "Cumul des points", tb_type_mesure.libelle as "Mesure", tb_type_habitat.libelle as "Type Habitat" 
    FROM t_users_dossiers
    LEFT OUTER JOIN t_users ON t_users_dossiers.id_user = t_users.id_user
    LEFT OUTER JOIN maj_etat_civil ON  t_users_dossiers.id_maj = maj_etat_civil.id_maj
    LEFT OUTER JOIN maj_mesures ON maj_etat_civil.id_maj=maj_mesures.id_maj
    LEFT OUTER JOIN tb_type_mesure ON maj_mesures.mesure_type_id=tb_type_mesure.id_mesure
    LEFT OUTER JOIN maj_adresses ON  t_users_dossiers.id_maj = maj_adresses.id_maj
    LEFT OUTER JOIN tb_type_habitat ON maj_adresses.id_type_habitat=tb_type_habitat.id_habitat
    WHERE user_fonction="2"
    AND (CURDATE() BETWEEN gest_date_debut AND gest_date_fin
    		    OR CURDATE()>=gest_date_debut AND gest_date_fin IS NULL)
    AND t_users_dossiers.id_trt BETWEEN 1 AND 4
    GROUP BY maj_etat_civil.id_maj
    UNION ALL
    SELECT CONCAT(user_nom, user_prenom) as 'Délégué', maj_num_dos as "Dossier", maj_nom as "Nom", maj_prenom as "Prénom", maj_pts_logement as "Logement", maj_pts_personne as "Personne", maj_pts_gestion as "Gestion", maj_pts_temps as "Temps", maj_pts_new_dossier as "Nouveau", maj_pts_hors_norme as "Hors Norme", SUM(maj_pts_logement+maj_pts_personne+maj_pts_gestion+maj_pts_temps+maj_pts_new_dossier+maj_pts_hors_norme) as "Cumul des points", tb_type_mesure.libelle as "Mesure", tb_type_habitat.libelle as "Type Habitat" 
    FROM t_users_dossiers
    LEFT OUTER JOIN t_users ON t_users_dossiers.id_user = t_users.id_user
    LEFT OUTER JOIN maj_etat_civil ON  t_users_dossiers.id_maj = maj_etat_civil.id_maj
    LEFT OUTER JOIN maj_mesures ON maj_etat_civil.id_maj=maj_mesures.id_maj
    LEFT OUTER JOIN tb_type_mesure ON maj_mesures.mesure_type_id=tb_type_mesure.id_mesure
    LEFT OUTER JOIN maj_adresses ON  t_users_dossiers.id_maj = maj_adresses.id_maj
    LEFT OUTER JOIN tb_type_habitat ON maj_adresses.id_type_habitat=tb_type_habitat.id_habitat
    WHERE user_fonction="2"
    AND (CURDATE() BETWEEN gest_date_debut AND gest_date_fin
    		    OR CURDATE()>=gest_date_debut AND gest_date_fin IS NULL)
    AND t_users_dossiers.id_trt BETWEEN 1 AND 4
    Mais là il n'est plus d'accord, le résultat est qu'il veut un "group by" sur le 2ème SELECT. Dans l'exemple que m'a fournit fred_crrm, il n'y en avait pas et cela fonctionnait très bien.

    Si je met le "group by", je n'ai pas le total attendu.

    Pourtant, j'ai bien
    Bien entendu il est indispensable que les deux ordres SELECT :

    * produisent un même nombre de colonnes
    * que les types de données de chaque paires ordonnées de colonnes soient de même type (ou d'un type équivalent)

  15. #15
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 398
    Points : 641
    Points
    641
    Par défaut
    Il faut que tu remplaces les colonnes variables (non aggrégats) du second select par des valeurs fixes de même type ('' pour les caractères, 0 pour les numériques).
    Exemple pour la première colonne tu peux remplacer CONCAT(user_nom, user_prenom) AS 'Délégué' par 'total' as délégué...
    Ensuite tu ajoutes le même group by et cela devrait fonctionner...

  16. #16
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Citation Envoyé par lper
    Il faut que tu remplaces les colonnes variables (non aggrégats) du second select par des valeurs fixes de même type ('' pour les caractères, 0 pour les numériques).
    Exemple pour la première colonne tu peux remplacer CONCAT(user_nom, user_prenom) AS 'Délégué' par 'total' as délégué...
    Ensuite tu ajoutes le même group by et cela devrait fonctionner...
    Super et j'ai fait le 'total' as 'délégué'.

    Allez je rajoute un petit tri a tout ça, du genre "ORDRE BY 'Délégué'

    Et zou, plus de 'Total'. Je cherche, je cherche.... vois pas.... vraiment je ne comprends pas...

    Mais c'est bien sûr .

    'total' as 'délégué' est aussi trié, donc mon total est dans l'ordre alphabétique des Délégués.

    Je cherche et je le trouve coincé entre le "S" et le "U".

    Damned, je ne peux pas trier cette requête.

  17. #17
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 398
    Points : 641
    Points
    641
    Par défaut
    Allez, une ptite astuce...Ajoute une colonne bidon dans la projection que tu mets par exemple à 1 pour le premier select, 2 pour le total.
    Bon, tu devines ensuite ?



    Oui, bravo, tu fais un tri ensuite en priorité sur cette nouvelle colonne !!!
    (select 1 as bidon, .....
    union
    select 2 as bidon, ....
    order by bidon, ...)

  18. #18
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Oui mais "bidon" va s'afficher.

  19. #19
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 398
    Points : 641
    Points
    641
    Par défaut
    Bon allez, j'abandonne là sinon tu ne vas plus m'aimer...

  20. #20
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Merci Iper, c'était Super.

    Je vais bien finir par trouver la solution à ce point de détail

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

Discussions similaires

  1. Peut-on faire une API avec Delphi ?
    Par WebPac dans le forum API, COM et SDKs
    Réponses: 14
    Dernier message: 11/04/2023, 14h48
  2. [Généralités] Peut ton faire un developpement par "brique" avec Windev
    Par Techys dans le forum WinDev
    Réponses: 7
    Dernier message: 30/06/2011, 10h42
  3. charger une date par défaut avec sql Loader
    Par top-dogg dans le forum SQL*Loader
    Réponses: 15
    Dernier message: 18/12/2006, 10h59
  4. Réponses: 4
    Dernier message: 26/05/2006, 11h39
  5. Comment faire une division par 5 avec les decalages
    Par Zaion dans le forum Assembleur
    Réponses: 7
    Dernier message: 05/11/2004, 17h33

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