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

SQL Oracle Discussion :

Plusieurs count de plusieurs tables dans un select


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 364
    Points : 86
    Points
    86
    Par défaut Plusieurs count de plusieurs tables dans un select
    Bonjour,

    Tout est dans le titre !

    Je fais un count sur une table contenant des informations de commandes et j'aimerais faire 2 autres count sur 2 tables différentes contenant les envois desdites commandes.

    Ci-dessous ma requête actuelle :

    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 distinct STATS.T_DATA_SOURCE_REPORTING.LIBELLE_CAMPAGNE as campagne,
    case MOAPP.SCF_SIGNALETIQ.DR_ID_COURT when '02' then 'BORDEAUX' 
                                                                       when '03' then 'PARIS'
                                                                       when '07' then 'LILLE'
                                                                       when '08' then 'LYON'
                                                                       when '10' then 'MARSEILLE'
                                                                       when '11' then 'NANCY'
                                                                       when '16' then 'RENNES'
                                                                       when '20' then 'IDF' 
                                                                       else null end as dr,
    MOAPP.SCF_SIGNALETIQ.NOM_USUEL_PERE as groupe_plaque,                                                                   
    STATS.T_DATA_SOURCE_REPORTING.CD_RRF_COM as RRF,
    MOAPP.SCF_SIGNALETIQ.NOM_COMMERCIAL,
    STATS.T_DATA_SOURCE_REPORTING.DT_GENERATION date_commande,
    upper (STATS.T_DATA_SOURCE_REPORTING.CANAL) as canal,
    STATS.T_DATA_SOURCE_REPORTING.NUM_COMMANDE as numero_commande,
    STATS.T_DATA_SOURCE_REPORTING.LIBELLE_COMMANDE,
    count (*) as volume_commande
    from STATS.T_DATA_SOURCE_REPORTING, MOAPP.SCF_SIGNALETIQ, MOAPP.CO001_CMMND
    where STATS.T_DATA_SOURCE_REPORTING.CD_RRF_COM = MOAPP.SCF_SIGNALETIQ.AFFAIRE_ID
    and STATS.T_DATA_SOURCE_REPORTING.NUM_COMMANDE = MOAPP.CO001_CMMND.CO001CMNUM
    and STATS.T_DATA_SOURCE_REPORTING.ID_CAMPAGNE = 'CPG000191'
    and STATS.T_DATA_SOURCE_REPORTING.NUM_COMMANDE not like 'centrl%'
    and STATS.T_DATA_SOURCE_REPORTING.TYPE_DE_SORTIE in ('contacts', '@')
    and MOAPP.CO001_CMMND.CO001ETAT in ('E', 'V')
    group by STATS.T_DATA_SOURCE_REPORTING.LIBELLE_CAMPAGNE,
    STATS.T_DATA_SOURCE_REPORTING.DT_GENERATION,
    STATS.T_DATA_SOURCE_REPORTING.NUM_COMMANDE,
    STATS.T_DATA_SOURCE_REPORTING.CANAL,
    STATS.T_DATA_SOURCE_REPORTING.LIBELLE_COMMANDE,
    STATS.T_DATA_SOURCE_REPORTING.CD_RRF_COM,
    MOAPP.SCF_SIGNALETIQ.DR_ID_COURT,
    MOAPP.SCF_SIGNALETIQ.NOM_COMMERCIAL,
    MOAPP.SCF_SIGNALETIQ.NOM_USUEL_PERE
    order by 2, 3, 4, 6 desc
    ;
    Je voudrais donc ajouter les colonnes suivantes :

    VOLUME ENVOYE CONTACTS
    DATE ENVOI CONTACTS
    VOLUME ENVOYE @
    DATE ENVOI @

    en me basant sur 2 tables différentes :

    IL001_DEST_@
    SFA_IT_SUIVI_CONTACTS

    Chacune de ces 2 tables seraient jointes par des numéros de commandes à la table référente :

    STATS.T_DATA_SOURCE_REPORTING.NUM_COMMANDE = IL001_DEST_@.NUM_COMMANDE
    STATS.T_DATA_SOURCE_REPORTING.NUM_COMMANDE = SFA_IT_SUIVI_CONTACTS.NUM_COMMANDE

    Mais je n'arrive à rien...

    Si quelqu'un parvient à comprendre ce que j'ai pu écrire, merci de son aide.

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 001
    Points : 2 505
    Points
    2 505
    Par défaut
    Tu as mis un @ dans le nom de tes colonnes et de tes tables...
    Pas bon, tu as dû violer les règles de nommage des objets Oracle pour ça, je me trompe?

    Sinon, il faut déjà remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    STATS.T_DATA_SOURCE_REPORTING.NUM_COMMANDE = IL001_DEST_@.NUM_COMMANDE
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    STATS.T_DATA_SOURCE_REPORTING.NUM_COMMANDE = "IL001_DEST_@"."NUM_COMMANDE"
    ==> il faut entourer IL001_DEST_@ par des guillemets pour que la table soit reconnue lors de l'analyse syntaxique.

    Est-ce que ça marche mieux?

    Au fait, quand tu dis "Mais je n'arrive à rien..." : cela signifie quoi? Tu as des messages d'erreur (si oui lesquels?), le résultat n'est pas celui que tu veux...?

  3. #3
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 129
    Points : 9 562
    Points
    9 562
    Par défaut
    Je vais beaucoup simplifier.
    A priori, tu sais faire 3 requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select id_commande, count(*) as volume_commande from commande group by id_commande 
     
    Select id_commande, count(*) as volume_commande from Deuxieme_table group by id_commande 
     
    Select id_commande, count(*) as volume_commande from Troisieme_table group by id_commande
    Ici mes 3 requêtes sont extrêmement simples, mais chaque requête peut faire des jointures complexes, comme ce que tu as mis dans ton cas.
    A partir de différentes requetes, tu peux faire une Super-Requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    With r1 as 
      (Select id_commande, count(*) as volume_commande from commande group by id_commande ),
    r2 as 
      ( Select id_commande, count(*) as volume_commande from Deuxieme_table group by id_commande ),
    r3 as 
      ( Select id_commande, count(*) as volume_commande from Troisieme_table group by id_commande )
    select r1.id_commande, r1.volume_commande as v1, r2.volume_commande as v2, r3.volume_commande as v3
    from r1, r2, r3
    where r2.id_commande = r1.id_commande and r3.id_commande = r1.id_commande
    En d'autres mots : Avec le mot clé WITH, le résultat d'une requête peut être utilisé comme si c'était une table.
    Ici, j'ai mis des jointures :r2.id_commande = r1.id_commande and r3.id_commande = r1.id_commande mais il faudra peut-être que tu utilises des FULL OUTER JOIN.

    PS : dans ta requête, tu fais SELECT DISTINCT ... GROUP BY
    Dans 99% des cas, quand on combine DISTINCT et GROUP BY, c'est un bug. Tu n'as aucune raison d'avoir un DISTINCT à ce niveau. Tu devrais t'attaquer à ça avant de tenter de merger tes 3 requêtes.

  4. #4
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 364
    Points : 86
    Points
    86
    Par défaut
    Citation Envoyé par Ikebukuro Voir le message
    Tu as mis un @ dans le nom de tes colonnes et de tes tables...
    Pas bon, tu as dû violer les règles de nommage des objets Oracle pour ça, je me trompe?

    Sinon, il faut déjà remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    STATS.T_DATA_SOURCE_REPORTING.NUM_COMMANDE = IL001_DEST_@.NUM_COMMANDE
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    STATS.T_DATA_SOURCE_REPORTING.NUM_COMMANDE = "IL001_DEST_@"."NUM_COMMANDE"
    ==> il faut entourer IL001_DEST_@ par des guillemets pour que la table soit reconnue lors de l'analyse syntaxique.

    Est-ce que ça marche mieux?

    Au fait, quand tu dis "Mais je n'arrive à rien..." : cela signifie quoi? Tu as des messages d'erreur (si oui lesquels?), le résultat n'est pas celui que tu veux...?
    En fait, j'ai remplacé un nom de colonne un peu trop explicite à exposer dans un forum par "@".

Discussions similaires

  1. Réponses: 9
    Dernier message: 29/11/2012, 11h26
  2. Réponses: 9
    Dernier message: 19/04/2009, 15h45
  3. Reunir plusieurs champs de 2 tables dans 1 colonne
    Par MANU_2 dans le forum Requêtes
    Réponses: 2
    Dernier message: 12/11/2007, 13h37
  4. Réponses: 24
    Dernier message: 09/07/2007, 13h08
  5. Réponses: 5
    Dernier message: 07/09/2006, 12h33

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