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 :

2 colonnes "count" dans un select ?


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut 2 colonnes "count" dans un select ?
    Bonjour à tous,

    voici mon problème : je dois compter dans une table le nombre de fois qu'un même utilisateur a créé ou modifié une ligne.

    On peut le schématiser de la manière suivante :

    Id_ligne | Createur | Modificateur
    --------------------------------
    1 | 10 | 12
    1 | 12 | 01
    1 | 12 | 10
    1 | 10 | 12

    Et je souhaiterais, avoir pour chaque utilisateur, le nombre de lignes modifiées et Crées sur 2 colonnes :

    Utilisateur| Nb Création | nombre modification
    --------------------------------------------
    10 | 2 | 1
    12 | 2 | 2
    01 | 0 | 1


    (Je schématise car je récupère également le nom de l'utilisateur et sa profession de 2 autres tables via jointures...)

    Voici la requête que j'utilise :

    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
    27
    28
    29
    30
    31
    32
    33
    34
     
    select 
       ni.NOM_COMPLET as 'Utilisateur',
       nm.LIBELLE as 'Libellé Métier',
       count(*) as 'Total Création'
     
    from ssr_rhs s 
     
       join noyau_intervenant ni
         on ni.INT_ID = s.createur
     
       join noyau_metier nm
         on nm.metier_id = ni.profession_id
     
    group by ni.NOM_COMPLET,nm.LIBELLE
     
    UNION ALL
     
    select 
       ni.NOM_COMPLET as 'Utilisateur',
       nm.LIBELLE as 'Libellé Métier',
       count(*) as 'Total Modif'
     
    from ssr_rhs s 
     
       join noyau_intervenant ni
         on ni.INT_ID = s.modificateur
     
       join noyau_metier nm
         on nm.metier_id = ni.profession_id
     
    group by ni.NOM_COMPLET,nm.LIBELLE
     
    order by count(*) desc
    Mais avec cette syntaxe, je récupère 2 lignes pour le même utilisateurs, or je souhaiterais une seule ligne par utilisateur.
    J'ai essayé de la modifier pour la regrouper, mais je n'y arrive pas.

    Si l'un de vous pourrais m'aiguiller, je vous en serais reconnaissant.
    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 820
    Points
    17 820
    Par défaut
    Rajoutez un type de modification dans vos deux requêtes, C pour création et M pour modification, faites votre union all et refaites un agrégat dessus de type pivot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select
        'Utilisateur',
        'Libellé Métier',
        sum(case 'TypeMod' when 'C' then 'Total Création' else 0 end) as 'Total Création',
        sum(case 'TypeMod' when 'M' then 'Total Modif'    else 0 end) as 'Total Modif'
    FROM
        <votre requête union>
    GROUP BY
        'Utilisateur',
        'Libellé Métier'

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Erreur SQL...
    Merci Waldar pour votre réponse rapide.

    Je viens de tester en utilisant la syntaxe suivante :

    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
    27
    28
    29
    30
    31
    32
    33
     
    SELECT
       'Utilisateur',
       'Libellé Métier',
        sum(case 'TypeMod' when 'C' then 'Total Création' else 0 end) AS 'Total Création',
        sum(case 'TypeMod' when 'M' then 'Total Modif'    else 0 end) AS 'Total Modif'
    FROM
    		(
    		  select 
    			  ni.NOM_COMPLET as 'Utilisateur',
    			  nm.LIBELLE as 'Libellé Métier',
    			  'C' as 'TypeMod'
    			from ssr_rhs s 
    			join noyau_intervenant ni
    			  on ni.INT_ID = s.createur
    			join noyau_metier nm
    			  on nm.metier_id = ni.profession_id
     
    			UNION ALL
     
    			select 
    			  ni.NOM_COMPLET as 'Utilisateur',
    			  nm.LIBELLE as 'Libellé Métier',
    			  'M' as 'TypeMod'
    			from ssr_rhs s 
    			join noyau_intervenant ni
    			  on ni.INT_ID = s.modificateur
    			join noyau_metier nm
    			  on nm.metier_id = ni.profession_id)
    		)
    GROUP BY
    		'Utilisateur',
        'Libellé Métier'
    Je suis sous SQL Server 2005 et utilise Toad, et il me ressort l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Syntaxe incorrecte vers ')'.
    Ai-je mal compris ou oublier quelque chose ?
    Merci encore de votre coup de main

  4. #4
    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
    Avec SQL Server il faut toujours aliaser les sous-requêtes.
    Sinon vous avez retiré les count(*) de la sous-requête, ils faut les laisser !

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Requête fonctionnelle
    Merci pour votre aide Waldar, j'ai réussi à faire fonctionner la requête grâce à vos conseils.

    Voici le code utilisé s'il peut aider d'autres personnes

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    SELECT 
       T.Utilisateur,
       T.Lib_Metier,
        sum(case T.TypeMod when 'C' then T.Tot else 0 end) AS 'Total Création',
        sum(case T.TypeMod when 'M' then T.Tot else 0 end) AS 'Total Modification'
    FROM
      (
      select 
        ni.NOM_COMPLET as Utilisateur,
        nm.LIBELLE as Lib_Metier,
        'C' as TypeMod, count(*) as Tot
      from ssr_rhs s 
      join noyau_intervenant ni
        on ni.INT_ID = s.createur
      join noyau_metier nm
        on nm.metier_id = ni.profession_id
      group by ni.NOM_COMPLET,nm.LIBELLE
     
      UNION ALL
     
      select 
        ni.NOM_COMPLET as Utilisateur,
        nm.LIBELLE as Lib_Metier,
        'M' as TypeMod, count(*) as Tot
      from ssr_rhs s 
      join noyau_intervenant ni
        on ni.INT_ID = s.modificateur
      join noyau_metier nm
        on nm.metier_id = ni.profession_id
      group by ni.NOM_COMPLET,nm.LIBELLE	
    ) as T
     
    GROUP BY
    T.Utilisateur,
    T.Lib_Metier
    order by 'Total Création' Desc

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/09/2005, 14h39

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