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

Administration Oracle Discussion :

plusieurs COUNT sur une seule table avec conditions différentes


Sujet :

Administration Oracle

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut plusieurs COUNT sur une seule table avec conditions différentes
    Bonjour,

    j'ai la table basique 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
    CREATE TABLE tmptable ( 
    	id NUMBER(10) NOT NULL,
    	lieu CHAR(10) NOT NULL,
    	moment DATE DEFAULT SYSDATE NOT NULL,
    ) 
    ;
     
    INSERT INTO tmptable( id , lieu , moment)
    VALUES              ( 1 , 1 , SYSDATE-3);
    INSERT INTO tmptable( id , lieu , moment)
    VALUES              ( 2 , 2 , SYSDATE-2);
    INSERT INTO tmptable( id , lieu , moment)
    VALUES              ( 3 , 3 , SYSDATE-2);
    INSERT INTO tmptable( id , lieu , moment)
    VALUES              ( 4 , 1 , SYSDATE);
    INSERT INTO tmptable( id , lieu , moment)
    VALUES              ( 5 , 3 , SYSDATE);
    INSERT INTO tmptable( id , lieu , moment)
    VALUES              ( 6 , 3 , SYSDATE);
    INSERT INTO tmptable( id , lieu , moment)
    VALUES              ( 7 , 2 , SYSDATE);
    INSERT INTO tmptable( id , lieu , moment)
    VALUES              ( 8 , 2 , SYSDATE-1);
    Je dois récupérer les informations comme suit : le lieu, le nombre d'enregistrement pour le jour-même, le nombre d'enregistrement pour la veille et le nombre d'enregistrement pour l'avant-veille.

    J'ai pensé utiliser une requête complexe comme 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
    SELECT lieu,
        COUNT(DISTINCT aj.*) AS aujourdhui,
        COUNT(DISTINCT hi.*) AS hier,
        COUNT(DISTINCT au.*) AS auparavant
    FROM
       tmptable aj,
       tmptable hi,
       tmptable au
    WHERE
          (aj.lieu = hi.lieu)
        AND (aj.lieu = au.lieu)
        AND (TRUNC(aj.moment) = TRUNC(SYSDATE))
        AND (TRUNC(hi.moment) = TRUNC(SYSDATE-1))
        AND (TRUNC(au.moment) < TRUNC(SYSDATE-1))
    GROUP BY lieu;
    Malheureusement, comme vous pouvez vous en douter, cela ne fonctionne pas. Comment modifier ma requête pour obtenir le résultat suivant (avec le test donné) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    lieu aujourdhui hier auparavant
       1          1    0          1
       2          1    1          1
       3          2    0          1

  2. #2
    Membre régulier
    Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 105
    Points
    105
    Par défaut
    Cette requête répond à ta demande :
    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
     
    select lieu,sum(aujourdhui) as aujourdhui,sum(hier) as hier,sum(auparavant) as auparavant
    from(
    select lieu,COUNT( moment) AS aujourdhui,
        COUNT( moment)-COUNT( moment) AS hier,
        COUNT( moment)-COUNT( moment) AS auparavant 
    from tmptable
    where TRUNC(moment) = TRUNC(SYSDATE)
    group by lieu
    union all
    select lieu,COUNT(moment)-COUNT(moment) AS aujourdhui,
        COUNT( moment) AS hier,
        COUNT( moment)-COUNT( moment) AS auparavant 
    from tmptable
    where TRUNC(moment) = TRUNC(SYSDATE-1)
    group by lieu,moment
    union all
    select lieu,COUNT( moment)-COUNT( moment) AS aujourdhui,
        COUNT( moment)-COUNT( moment) AS hier,
        COUNT( moment) AS auparavant 
    from tmptable
    where TRUNC(moment) < TRUNC(SYSDATE-1)
    group by lieu,moment)
    group by lieu
    Ceci dit, je ne suis pas certain quelle soit très performante sur des tables ayant une grosse volumétrie.

    Bon courage...
    Le hasard ne favorise que les esprits préparés.

  3. #3
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT lieu,
    SUM(CASE WHEN TRUNC(aj.moment) = TRUNC(SYSDATE) THEN 1 ELSE 0 END) AS aujourdhui,
    SUM(CASE WHEN TRUNC(aj.moment) = TRUNC(SYSDATE-1) THEN 1 ELSE 0 END) AS hier,
    SUM(CASE WHEN TRUNC(aj.moment) < TRUNC(SYSDATE-1) THEN 1 ELSE 0 END) AS auparavant
    FROM
       tmptable aj,
       tmptable hi,
       tmptable au
    WHERE
          (aj.lieu = hi.lieu)
        AND (aj.lieu = au.lieu)
    GROUP BY lieu;
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Merci beaucoup à vous deux

    Je dois avouer que vos deux réponses me bluffent car elles furent rapides et le résultat en découlant est exactement ce que je souhaitais. Celle de nuke_y me bluffe d'autant plus qu'elle prend moins de 10 lignes : on peut encore supprimer deux tmptable pour n'en garder plus qu'une, ainsi que toute la clause where. Ce qui fait que la requête instancie une seule fois tmptable, contre trois avec ce que je m'attendais et ce que djeant m'a donné.

  5. #5
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Fait quand même gaffe à un truc : ma requête ne contient pas de distinct, donc si c'était important, ça peut fausser les résultats. Si tu utilisais Distinct pour des histoires de doublons provoqués par tes tables satellites, il vaudrait mieux utiliser le EXISTS plutôt qu'une jointure + distinct.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Non, la requête se fait bien sur une et une seule table.

    J'avais mis les Distinct parce qu'avec, le résultat se rapprochait de celui attendu, vu que j'utilisais trois fois la même table (une par groupe de dates) et que sans, j'obtenais des résultats incompréhensibles.

    J'avais bien entendu simplifié la table utilisée, mais une fois la requête retraduit pour coller à mon environnement, tout va très bien.

    Encore merci

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par nuke_y
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT lieu,
    SUM(CASE WHEN TRUNC(aj.moment) = TRUNC(SYSDATE) THEN 1 ELSE 0 END) AS aujourdhui,
    SUM(CASE WHEN TRUNC(aj.moment) = TRUNC(SYSDATE-1) THEN 1 ELSE 0 END) AS hier,
    SUM(CASE WHEN TRUNC(aj.moment) < TRUNC(SYSDATE-1) THEN 1 ELSE 0 END) AS auparavant
    FROM
       tmptable aj,
       tmptable hi,
       tmptable au
    WHERE
          (aj.lieu = hi.lieu)
        AND (aj.lieu = au.lieu)
    GROUP BY lieu;
    alors là, faut qu'on m'explique à quoi servent les tables hi et au...

    pourquoi pas faire simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT lieu,
    SUM(CASE WHEN TRUNC(aj.moment) = TRUNC(SYSDATE) THEN 1 ELSE 0 END) AS aujourdhui,
    SUM(CASE WHEN TRUNC(aj.moment) = TRUNC(SYSDATE-1) THEN 1 ELSE 0 END) AS hier,
    SUM(CASE WHEN TRUNC(aj.moment) < TRUNC(SYSDATE-1) THEN 1 ELSE 0 END) AS auparavant
    FROM
       tmptable aj
    GROUP BY aj.lieu;
    ??

  8. #8
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    J'en sais rien moi, à filtrer sur les lieux qui existent dans les tables ? Oui oui je sais, faudrait utiliser EXISTS, mais moi je rend service c'est tout
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  9. #9
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    ben, vu qu'il s'agit de la meme table je vois pas trop ce que ça va filtrer... ça va juste filtrer les colonne ou "lieu" est nul mais bon, y'a "is not null" pour ça...

    PS: j'ai fait un effort, j'ai passé toute une journée sans parler de EXISTS, mais si tu remets ça sur le tapis....

  10. #10
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    looooooooooooool. J'avais pas vu qu'il s'agissait de la même table en effet ! Ah ben oui dans ce cas là

    Je pense qu'il s'agissait de résidus d'artifice pour essayer de faire la requête qu'il voulait. Il a du réduire à une seule table dans sa requête finale.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/05/2009, 19h54
  2. faire une seule table avec plusieurs table
    Par bossboss dans le forum Access
    Réponses: 4
    Dernier message: 08/01/2007, 16h11
  3. [MySQL] Remplir plusieurs lignes d'une seule table avec le même formulaire
    Par zehni dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 07/09/2006, 12h12
  4. Réponses: 4
    Dernier message: 07/09/2006, 12h12
  5. Plusieures infos sur une seule ligne avec ou sans tableau
    Par Him dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 17/03/2006, 14h16

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