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 :

SQL: Requête Complexe


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Par défaut SQL: Requête Complexe
    Bonjour,

    Je voulais changer la requête initiale en enlevant le WITH mais cela me donne des valeurs erronées.

    Merci de bien vouloir m'aider.

    La requête initiale:

    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
    WITH TRAFI AS (SELECT ID_DATE, SUM(COUT_INTR) AS COUT_TRAFIC  FROM TRAFIC
    WHERE ID_DATE between '21/12/2007' and '27/12/2007'
    AND TYP_TRFC = 'Voice' 
    AND DIRC_APPL = 'OUT'
    GROUP BY ID_DATE),
    TRAFIC_OP AS (SELECT ID_DATE, SUM(COUT_INTR) AS COUT_TRAFIC_OPERATEUR FROM TRAFIC_OPERATEUR
    WHERE ID_DATE between '21/12/2007' and '27/12/2007'
    AND TYP_TRFC <> 'SMS'
    AND DIRC_APPL <> 'IN'
    GROUP BY ID_DATE),
    TICKETS_INTER AS (SELECT ID_DATE, SUM(COUT_HT) AS COUT_TICKETS_INTERCO FROM TICKETS_INTERCO
    WHERE ID_DATE  between '21/12/2007' and '27/12/2007'
    AND CALL_DIRC = 'OUT'
    AND CALL_TYP = 'Voice'
    AND CALL_TYP2 NOT IN ('1','2','3')
    GROUP BY ID_DATE)
    SELECT TRAFI.ID_DATE, TRAFI.COUT_TRAFIC, TRAFIC_OP.COUT_TRAFIC_OPERATEUR, TICKETS_INTER.COUT_TICKETS_INTERCO
    FROM TRAFI, TRAFIC_OP, TICKETS_INTER
    WHERE TRAFI.ID_DATE = TRAFIC_OP.ID_DATE
    AND TRAFI.ID_DATE = TICKETS_INTER.ID_DATE
    Solution1:

    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
    select T.id_date, sum(T.COUT_INTR), sum(TP.cout_intr), sum(TI.cout_ht)
    from trafic T, 
    ( 
    select cout_intr 
    from trafic_operateur
    WHERE ID_DATE between '21/12/2007' and '27/12/2007'
    AND TYP_TRFC <> 'SMS'
    AND DIRC_APPL <> 'IN'
    ) TP,
    (
    select cout_ht
    from tickets_interco
    WHERE ID_DATE  between '21/12/2007' and '27/12/2007'
    AND CALL_DIRC = 'OUT'
    AND CALL_TYP = 'Voice'
    AND CALL_TYP2 NOT IN ('1','2','3')
    ) TI
    WHERE ID_DATE between '21/12/2007' and '27/12/2007'
    AND TYP_TRFC = 'Voice' 
    AND DIRC_APPL = 'OUT'
    group by T.id_date

    Solution2:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select T.id_date, sum(T.COUT_INTR), sum(TP.cout_intr), sum(TI.cout_ht)
    from trafic T, trafic_operateur TP, tickets_interco TI
    where T.id_date = TP.id_date
    and  T.id_date = TI.id_date
    AND T.TYP_TRFC = 'Voice' 
    AND T.DIRC_APPL = 'OUT'
    AND TI.CALL_DIRC = 'OUT'
    AND TI.CALL_TYP = 'Voice'
    AND TI.CALL_TYP2 NOT IN ('1','2','3')
    AND TP.TYP_TRFC <> 'SMS'
    AND TP.DIRC_APPL <> 'IN'
    group by T.id_date

    Solution3:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select T.id_date, sum(T.COUT_INTR), sum(TP.cout_intr), sum(TI.cout_ht)
    from trafic T, trafic_operateur TP, tickets_interco TI
    where T.id_date = TP.id_date
    and  T.id_date = TI.id_date
    and T.ID_DATE between '21/12/2007' and '27/12/2007'
    AND T.TYP_TRFC = 'Voice' 
    AND T.DIRC_APPL = 'OUT'
    AND TI.CALL_DIRC = 'OUT'
    AND TI.CALL_TYP = 'Voice'
    AND TI.CALL_TYP2 NOT IN ('1','2','3')
    AND TP.TYP_TRFC <> 'SMS'
    AND TP.DIRC_APPL <> 'IN'
    group by T.id_date

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Soyez sympa et commencez par bien indenter vos requêtes. Sans cela c'est illisible et vous même aurez du mal à vous dépatouiller !

    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
    WITH 
     
    TRAFI AS 
    (SELECT ID_DATE, SUM(COUT_INTR) AS COUT_TRAFIC  
     FROM   TRAFIC
     WHERE  ID_DATE BETWEEN '21/12/2007' AND '27/12/2007'
       AND  TYP_TRFC = 'Voice' 
       AND  DIRC_APPL = 'OUT'
     GROUP  BY ID_DATE),
     
    TRAFIC_OP AS 
    (SELECT ID_DATE, SUM(COUT_INTR) AS COUT_TRAFIC_OPERATEUR 
     FROM   TRAFIC_OPERATEUR
     WHERE  ID_DATE BETWEEN '21/12/2007' AND '27/12/2007'
       AND  TYP_TRFC <> 'SMS'
       AND  DIRC_APPL <> 'IN'
     GROUP BY ID_DATE),
     
    TICKETS_INTER AS 
    (SELECT ID_DATE, SUM(COUT_HT) AS COUT_TICKETS_INTERCO 
     FROM   TICKETS_INTERCO
     WHERE  ID_DATE  BETWEEN '21/12/2007' AND '27/12/2007'
       AND  CALL_DIRC = 'OUT'
       AND  CALL_TYP = 'Voice'
       AND  CALL_TYP2 NOT IN ('1','2','3')
     GROUP  BY ID_DATE)
     
    SELECT TRAFI.ID_DATE, TRAFI.COUT_TRAFIC, TRAFIC_OP.COUT_TRAFIC_OPERATEUR, TICKETS_INTER.COUT_TICKETS_INTERCO
    FROM   TRAFI
           INNER JOIN TRAFIC_OP
                 ON TRAFI.ID_DATE = TRAFIC_OP.ID_DATE
           INNER JOIN TICKETS_INTER
                 ON TRAFI.ID_DATE = TICKETS_INTER.ID_DATE
    Voici une solution.

    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
     
    SELECT TRAFI.ID_DATE, TRAFI.COUT_TRAFIC, TRAFIC_OP.COUT_TRAFIC_OPERATEUR, TICKETS_INTER.COUT_TICKETS_INTERCO
    FROM   (SELECT ID_DATE, SUM(COUT_INTR) AS COUT_TRAFIC  
            FROM   TRAFIC
            WHERE  ID_DATE BETWEEN '21/12/2007' AND '27/12/2007'
              AND  TYP_TRFC = 'Voice' 
              AND  DIRC_APPL = 'OUT'
            GROUP  BY ID_DATE) AS TRAFI
           INNER JOIN (SELECT ID_DATE, SUM(COUT_INTR) AS COUT_TRAFIC_OPERATEUR 
                       FROM   TRAFIC_OPERATEUR
                       WHERE  ID_DATE BETWEEN '21/12/2007' AND '27/12/2007'
                         AND  TYP_TRFC <> 'SMS'
                         AND  DIRC_APPL <> 'IN'
                       GROUP BY ID_DATE) AS TRAFIC_OP
                 ON TRAFI.ID_DATE = TRAFIC_OP.ID_DATE
           INNER JOIN (SELECT ID_DATE, SUM(COUT_HT) AS COUT_TICKETS_INTERCO 
                       FROM   TICKETS_INTERCO
                       WHERE  ID_DATE  BETWEEN '21/12/2007' AND '27/12/2007'
                         AND  CALL_DIRC = 'OUT'
                         AND  CALL_TYP = 'Voice'
                         AND  CALL_TYP2 NOT IN ('1','2','3')
                       GROUP  BY ID_DATE) AS TICKETS_INTER
                 ON TRAFI.ID_DATE = TICKETS_INTER.ID_DATE
    Néanmoins je préfère nettement la version CTE plus lisible.

    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/ * * * * *

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Par défaut
    Je voulais comparer 3 tables. Je m'explique.

    - 1ère table: id_date, cout1 et d'autres champs
    - 2ème table: id_date, cout2 et d'autres champs
    - 3ème table: id_date, cout3 et d'autres champs

    La requête consiste à donner la somme de chacun des couts groupés par id_date

    ex: id_date | sum(cout1) | sum(cout2) | sum(cout3)

    La requête que j'ai pu réaliser est la 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
    with 
    tb1 as (select id_date, sum(cout1) from table1
    where condition1 and condition2 ...
    group by id_date),
    tb2 as (select id_date, sum(cout2) from table2
    where condition1 and condition2 ...
    group by id_date),
    tb3 as (select id_date, sum(cout3) from table3
    where condition1 and condition2 ...
    group by id_date),
    select tb1.id_date, tb1.cout1 , tb2.cout2, tb3.cout3
    from tb1, tb2, tb3
    where tb1.id_date = tb2.id_date
    and tb1.id_date = tb3.id_date
    Le problème reste au niveau du temps d'exécution surtout par rapport à la volumétrie des données stockées.

    J'ai utilisé les techniques d'optimisation des requêtes mais malgrés cela il y a toujours ce problème.

    Si cela est possible j'aimerai avoir une autre façon d'écrire ma requête d'une manière plus optimale.

    Merci d'avance pour votre aide.

    cordialement.

  4. #4
    Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Par défaut
    Je vous remercie Sqlpro d’avoir pris le temps de lire ma demande et d’y répondre.
    Je tiens à préciser que mon problème se pose sur le temps d’exécution de la requête, je cherche à ce qu'il soit optimal, la requête que vous m’aviez proposé prend autant de temps que la mienne.

    Ma requête initiale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    WITH 
    tb1 AS (SELECT id_date, sum(cout1) as cout1 FROM table1
    WHERE condition1 AND condition2 ...
    GROUP BY id_date),
    tb2 AS (SELECT id_date, sum(cout2) as cout2 FROM table2
    WHERE condition1 AND condition2 ...
    GROUP BY id_date),
    tb3 AS (SELECT id_date, sum(cout3) as cout3 FROM table3
    WHERE condition1 AND condition2 ...
    GROUP BY id_date),
    SELECT tb1.id_date, tb1.cout1 , tb2.cout2, tb3.cout3
    FROM tb1, tb2, tb3
    WHERE tb1.id_date = tb2.id_date
    AND tb1.id_date = tb3.id_date
    La votre:

    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
    Select tb1.id_date, tb1.cout1, tb2.cout2, tb3.cout3
    From 
    (Select id_date, sum (cout1) as cout1
    From table1
    Where condition1, condition2…
    Group by id_date) as tb1
    Inner join (Select id_date, sum (cout2) as cout2
    From table2
    Where condition1, condition2…
    Group by id_date) as tb2
    On tb1.id_date = tb2.id_date
    Inner join (Select id_date, sum (cout3) as cout3
    From table3
    Where condition1, condition2…
    Group by id_date) as tb3
    On tb1.id_date = tb3.id_date
    Merci de m'aider.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Il aurait été plus simple de poser la bonne question dès le départ !

    Commencez dans ce cas par décrire l'intégralité de vos tables sous forme d'ordre DDL.

    En cela vous respecterez la charte de postage : http://www.developpez.net/forums/ann....php?f=37&a=69

    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/ * * * * *

Discussions similaires

  1. [Linq to SQL] requête complexe faites chauffer vos méninges ;)
    Par anthyme dans le forum Accès aux données
    Réponses: 5
    Dernier message: 06/06/2008, 09h52
  2. [SQL] Requête complexe sur plusieurs tables
    Par BFH dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/09/2007, 16h21
  3. [SQL] Requête complexe: syntaxe
    Par Pahcixam dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 24/08/2006, 17h48
  4. [SQL Oracle] Requête complexe
    Par lapartdombre dans le forum Langage SQL
    Réponses: 1
    Dernier message: 02/11/2005, 14h31
  5. [SQL] Requête complexe avec appel multiple à la même table
    Par Julien Dufour dans le forum Langage SQL
    Réponses: 9
    Dernier message: 14/04/2005, 14h12

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