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 :

Deux counts avec chacun un group by


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Par défaut Deux counts avec chacun un group by
    Bonjour,

    J'aimerais faire une requête, mais je n'suis même pas certaine que celle-ci est faisable.
    Voici l'énoncé :

    J'ai une table qu'on appellera RHS. Dans celle-ci, une clé unique bien sur, et moultes champs dont les deux qui nous intéressent : dependancerelation et dependancecomportement.
    Ces champs contiennent le niveau de dépendance c'est à dire 1, 2, 3 ou 4 (ou autre si l'utilisateur a saisi n'importe quoi, mais seuls les résultats de ces 4 niveaux m'intéressent)

    Ce que j'aimerais :
    Niveau DepRelation DepComportement
    1----------456-------------455
    2----------123-------------170
    3-----------45--------------35
    4------------2---------------8
    (les tirets sont là uniquement pour l'alignement)
    La colonne DepRelation contiendrait le nombre d'occurences de la table RHS pour lequel le niveau de dépendance est 1, puis 2, puis 3, puis 4.
    Ce n'est pas compliqué si je veux le calcul pour uniquement la dépendancerelation ou la dépendancecomportement, mais j'aimerais pour les deux.
    Est-ce faisable ?

    Merci d'avance !

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 134
    Par défaut
    Il faudrait que tu nous donne un peu plus de renseignements :

    • La structure de ta ou tes tables
    • Une exemple des données
    • La requête que tu as commencé à écrire, même si elle ne fonctionne pas.
    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.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Par défaut
    Hello !

    alors ma table est celle-ci :
    RHS(rhcleunik, numsejour, gmd, [...], depcomportement, deprelation, [...])
    (1, 100, 01A03, 1, 3)
    (2, 100, 01A03, 1, 2)
    (3, 101, 02A07, 2, 3)
    (4, 102, 01A07, 1, 4)

    avec des mots : un séjour est découpé en semaines (RHS), chaque semaine le médecin évalue le degré d'autonomie du patient selon plusieurs critères : le comportement, la relation, l'habillage, la continence, le déplacement, l'alimentation et pour chacun attribue une note de 1 à 4.
    J'ai besoin de savoir pour chacun des critères et chacun des niveaux, le nombre de semaines (RHS) concernées. (et plus tard, groupés par GMD c'est à dire pathologie).

    jusque là je sortais une statistique pour un seul des critères de dépendance à la fois, comportement par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT depcleunik, Count( depcomportement ) AS nbsem
    FROM rhs
    RIGHT JOIN dependance ON rhs.depcomportement = dependance.depcleunik
    AND rhs.annee = '2010'
    GROUP BY depcleunik
    ORDER BY depcleunik
    J'ai fait une table à part nommée "dependance" et qui contient juste 1, 2, 3 et 4 parce que je ne veux de résultat que pour ces niveaux de dépendance, c'est ptêt débile d'ailleurs =x
    dependance(depcleunik)

    Pour ma requête, dans un premier temps je voudrais le résultat pour deux des dépendances : relation et comportement. J'ai essayé dans tous les sens, avec deux joins sur la table RHS (rhs1, rhs2), deux joins sur la table dépendance etc. rien n'y fait. Au final je me dis que c'est impossible, mais j'ai appris le SQL y'a 15 ans et je me dis qu'il y a peut-être eu des nouveautés permettant de faire ça.
    Au pire je ferai des requêtes séparées pour chacune des dépendances et bidouillerai pour tout afficher dans le même tableau ! Mais comme je suis curieuse, j'ai quand même posté ici =)

  4. #4
    Membre actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 44
    Par défaut
    Bonjour,

    Je vous propose la req. 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
     
    SELECT d.depcleunik                            AS Niveau
             ,(SELECT count(*)
                   FROM rhs
                 WHERE rhs.dependancerelation = dependance.depcleunik
                      AND rhs.annee = '2010'
              )                                            AS DepRelation
             ,(SELECT count(*)
                   FROM rhs
                 WHERE rhs.depcomportement = dependance.depcleunik
                      AND rhs.annee = '2010'
              )                                            AS DepComportement
      FROM dependance d
    ORDER BY d.depcleunik
    Cette requete vous renverra toujours 4 lignes.
    Résultat attendu avec votre dernier exemple :
    Niveau DepRelation DepComportement
    1-------null-----------3
    2----------1-----------1
    3----------2-----------null
    4----------1-----------null

    Si, à la place des null, vous voulez de zéros, utilisez la fonction coalesce (sous Oracle ou Postgres).

    Cdlt,
    OD

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Par défaut
    Merci mille fois !

    Je ne savais pas qu'on pouvait mettre des selects dans le select !

    Et si je veux ce résultat pour chaque gmd différent ? est-ce possible ?

    Merci encore

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Plus simple avec les fonction de fenêtrage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT d.depcleunik AS Niveau,
           Count( depcomportement ) OVER(PARTITION BY depcleunik) AS ???,
           Count( DepRelation  )    OVER(PARTITION BY ???) AS nbsem,
    FROM   rhs
           RIGHT JOIN dependance 
                 ON rhs.depcomportement = dependance.depcleunik
                    AND rhs.annee = '2010'
    ORDER BY d.depcleunik
    Reste à remplir les manques, car vous ne nous avez pas donné toutes les billes.

    Lisez l'article que j'ai écrit à ce sujet : http://sqlpro.developpez.com/article...clause-window/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 44
    Par défaut
    Bonjour,

    En supposant que les GMD sont toutes listées dans une table nommée pathologie, on peut faire :
    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
     
    SELECT 
               p.gmd
             , d.depcleunik                            AS Niveau
             ,(SELECT count(*)
                   FROM rhs
                 WHERE rhs.dependancerelation = d.depcleunik
                      AND rhs.gmd                     = p.gmd
                      AND rhs.annee = '2010'
              )                                            AS DepRelation
             ,(SELECT count(*)
                   FROM rhs
                 WHERE rhs.depcomportement = d.depcleunik
                      AND rhs.gmd                     = p.gmd
                      AND rhs.annee = '2010'
              )                                            AS DepComportement
      FROM dependance d
             ,pathologie    p
    ORDER BY p.gmd, d.depcleunik
    Explication : On fait un produit cartésien pour obtenir toutes les combinaisons possibles entres les dépendances et les pathologies, puis on va comptabiliser par relation et par comportement.

    Si vous ne disposez pas de la table pathologie, vous pouvez la remplacer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      FROM dependance d
             ,(select distinct gmd from rhs) p

    Cdlt,
    OD

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Par défaut
    Merci Olivier, je n'avais pas du tout la bonne logique et étais très loin du compte.

    Merci également SQLPro pour votre réponse et pour le lien que je vais m'empresser de lire.

    Vous m'ôtez une grosse épine du pied

    Patricia

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 10/02/2011, 11h32
  2. COUNT avec deux WHERE différents
    Par grafik.muzik dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/02/2009, 16h12
  3. row count avec group dans crosstab
    Par lapin_hobbit dans le forum Jasper
    Réponses: 0
    Dernier message: 16/07/2008, 09h28
  4. max(count(*)) avec un GROUP BY (suite)
    Par awalter1 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/09/2007, 15h07
  5. max(count(*)) avec un GROUP BY
    Par awalter1 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/09/2007, 11h04

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