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

Requêtes et SQL. Discussion :

Problème d'utilisation des sous-requêtes


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 93
    Points : 51
    Points
    51
    Par défaut Problème d'utilisation des sous-requêtes
    Bonjour,

    Je suis actuellement en train de travailler sur l'élaboration d'une requête afin d'interroger ma base de données. Le but est d'obtenir la somme de deux sous-requêtes grouper par le numéro de la semaine. Les sous-requêtes interrogent la même table afin de compter le nombre de lignes que l'on obtient en filtrant ma demande par deux where différents.

    Voici mon code :

    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
    SELECT (tb2.total+tb1.total) AS Expr2, tb1.Expr1
    FROM 
    (
    SELECT Count(objet.numero) AS total, DatePart('ww',[objet].[date],2,1)-1 AS Expr1
    FROM objet INNER JOIN (magasin INNER JOIN m_s_o ON magasin.identifiant = m_s_o.identifiant) ON objet.numero = m_s_o.numero
    WHERE (((magasin.identifiant)="DA11"))
    GROUP BY DatePart('ww',[objet].[date],2,1)
    )  AS tb1, 
     
    (
    SELECT Count(objet.numero) AS total, DatePart('ww',[objet].[date],2,1)-1 AS Expr1
    FROM objet INNER JOIN (magasin INNER JOIN m_s_o ON magasin.identifiant = m_s_o.identifiant) ON objet.numero = m_s_o.numero
    WHERE (((magasin.identifiant)="DA11"))
    GROUP BY DatePart('ww',[objet].[date],2,1)
    )  AS tb2
     
    GROUP BY Expr2
    Le problème, que je rencontre actuellement, est que mon GROUP BY ne fonctionne pas n'ayant de de fonction d'agrégation pour mon (tb2.total+tb1.total).
    En enlevant ce group by j'obtiens 20 fois 20 lignes (20 numéro de semaine) où on a une seule valeur de la somme qui est juste par vingtaine (cad la premiere ligne est bonne, la 22 est bonne, la 33 est bonne, etc.

    L'objectif final est d'obtenir les 20 semaines avec la somme pour chaque semaine des deux COUNT.
    Pourriez-vous m'aider, svp ?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 102
    Points : 28 399
    Points
    28 399
    Par défaut
    C'est juste qu'il faut faire une jointure entre les sous-requêtes :
    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 (tb2.total+tb1.total) AS Expr2, tb1.Expr1
    FROM 
    (
    SELECT Count(objet.numero) AS total, DatePart('ww',[objet].[date],2,1)-1 AS Expr1
    FROM objet INNER JOIN (magasin INNER JOIN m_s_o ON magasin.identifiant = m_s_o.identifiant) ON objet.numero = m_s_o.numero
    WHERE (((magasin.identifiant)="DA11"))
    GROUP BY DatePart('ww',[objet].[date],2,1)
    )  AS tb1 
    INNER JOIN
    (
    SELECT Count(objet.numero) AS total, DatePart('ww',[objet].[date],2,1)-1 AS Expr1
    FROM objet INNER JOIN (magasin INNER JOIN m_s_o ON magasin.identifiant = m_s_o.identifiant) ON objet.numero = m_s_o.numero
    WHERE (((magasin.identifiant)="DA11"))
    GROUP BY DatePart('ww',[objet].[date],2,1)
    )  AS tb2
    ON tb1.Expr1 = tb2.Expr1
    Au passage, je n'ai pas bien saisi la différence entre les deux sous-requêtes

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 93
    Points : 51
    Points
    51
    Par défaut
    Merci beaucoup, tu me refais ma soirée ^^
    Là je voulais déjà que ça marche donc j'avais mis les deux même sous requêtes pour voir si j'obtenais bien le double.
    Que réalise exactement la jointure ici ? Elle permet de "fusionner" les deux colonnes de ma requête ?

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 102
    Points : 28 399
    Points
    28 399
    Par défaut
    Dans ton cas, elle met "face à face" les lignes correspondant à la même semaine.
    Pour en savoir plus : Les jointures, ou comment interroger plusieurs tables

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 93
    Points : 51
    Points
    51
    Par défaut
    D'accord merci.
    J'ai essayé d'en faire un tableau croisé dynamique mais faire la synthase normalisée de TRANSFORM SELECT GROUP BY PIVOT ne fonctionne pas. Tu aurais 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
     
    TRANSFORM 
    (tb2.total+tb1.total) 
    FROM (SELECT Count(objet.numero) AS total, DatePart('ww',[objet].[date],2,1)-1 AS Expr1
    FROM objet INNER JOIN (magasin INNER JOIN m_s_o ON magasin.identifiant = m_s_o.identifiant) ON objet.numero = m_s_o.numero
    WHERE (((magasin.identifiant)="D11A"))
    GROUP BY DatePart('ww',[objet].[date],2,1)
    )  AS tb1 INNER JOIN (SELECT Count(objet.numero) AS total, DatePart('ww',[objet].[date],2,1)-1 AS Expr1
    FROM objet INNER JOIN (magasin INNER JOIN m_s_o ON magasin.identifiant = m_s_o.identifiant) ON objet.numero = m_s_o.numero
    WHERE (((magasin.identifiant)="D11A"))
    GROUP BY DatePart('ww',[objet].[date],2,1)
    )  AS tb2 ON tb1.Expr1 = tb2.Expr1
     
    SELECT magasin.identifiant
    FROM objet INNER JOIN (magasin INNER JOIN m_s_o ON magasin.identifiant = m_s_o.identifiant) ON objet.numero = m_s_o.numero
    GROUP BY magasin.identifiant
    PIVOT DatePart('ww',[objet].[date],2,1);

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 93
    Points : 51
    Points
    51
    Par défaut
    Au final le code qu'il me fallait est le suivant :

    Code SQL : 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
     
    TRANSFORM (Count(tb2.total)+Count(tb1.total)) AS Expr2
    SELECT magasin.identifiant
    FROM 
    (
    SELECT (objet.numero) AS total, DatePart('ww',[objet].[date],2,1)-1 AS Expr1 
    FROM objet INNER JOIN (magasin INNER JOIN m_s_o ON magasin.identifiant = m_s_o.identifiant) ON objet.numero = m_s_o.numero
    WHERE objet.Mvt=301
    )  AS tb1 
    INNER JOIN 
    (
    (
    SELECT (objet.numero) AS total, DatePart('ww',[objet].[date],2,1)-1 AS Expr1 
    FROM objet INNER JOIN (magasin INNER JOIN m_s_o ON magasin.identifiant = m_s_o.identifiant) ON objet.numero = m_s_o.numero
    WHERE objet.Mvt=301
    )  AS tb2 
    INNER JOIN 
    (
    objet INNER JOIN (magasin INNER JOIN m_s_o ON magasin.identifiant = m_s_o.identifiant) ON objet.numero = m_s_o.numero) ON tb2.total = objet.numero) 
    ON (tb1.total = objet.numero) AND (tb1.Expr1 = tb2.Expr1)
    GROUP BY magasin.identifiant
    PIVOT DatePart('ww',[objet].[date],2,1)-1;

    Cependant quand les where de mes deux sous contraintes sont différents alors cela ne fonctionne pas, pourriez vous m'aider svp ?

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Votre problème est très confus, et la modification de vos messages n'aide pas à la compréhension.

    Postez la structure de vos tables, le tout idéalement accompagné d'un jeu d'essai.
    Indiquez le résultat attendu.

    Je pense que vous aurez ainsi une réponse correcte très rapidement.

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 93
    Points : 51
    Points
    51
    Par défaut
    Désolé, alors. Voici mon code :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    TRANSFORM (Count(tb2.total)+Count(tb1.total)) AS Expr2
    SELECT magasin.identifiant
    FROM (
    SELECT (objet.numero) AS total, DatePart('ww',[objet].[date],2,1)-1 AS Expr1 
    FROM objet INNER JOIN (magasin INNER JOIN m_s_o ON magasin.identifiant = m_s_o.identifiant) ON objet.numero = m_s_o.numero
    WHERE objet.Mvt=101
    )  AS tb1 INNER JOIN ((SELECT (objet.numero) AS total, DatePart('ww',[objet].[date],2,1)-1 AS Expr1 
    FROM objet INNER JOIN (magasin INNER JOIN m_s_o ON magasin.identifiant = m_s_o.identifiant) ON objet.numero = m_s_o.numero
    WHERE objet.Mvt=101
    )  AS tb2 INNER JOIN (objet INNER JOIN (magasin INNER JOIN m_s_o ON magasin.identifiant = m_s_o.identifiant) ON objet.numero = m_s_o.numero) ON tb2.total = objet.numero) ON tb1.total = objet.numero
    GROUP BY magasin.identifiant
    PIVOT DatePart('ww',[objet].[date],2,1)-1;

    Le problème est que quand j'ai deux WHERE différents dans mes sous-requêtes, cela ne marche plus.

    Nom : problème.png
Affichages : 254
Taille : 16,5 Ko

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 93
    Points : 51
    Points
    51
    Par défaut
    Après quelques recherches, je crois que mon problème est dû à mes INNER JOIN, il faudrait plutôt un modèle FULL JOIN cependant cela ne fonctionne pas quand je remplace le INNER JOIN entre les sous requetes par un FULL JOIN

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Ma boule de cristal m'indique que vous êtes sous Access. Si elle ne se trompe pas, c'est normal, il ne prend pas en charge le FULL OUTER JOIN.

    Pour le reste, vu que vous ne postez ni la requete que vous faites, ni le message d'erreur que vous obtenez, impossible de vous en dire plus a partir d'un simple
    ça ne marche pas
    ...

    Je pense que vous pouvez faire beaucoup plus simple, et vous passer de cette jointure, en faisant directement un GROUP BY avec des CASE dans des fonctions d'agrégats pour gérer vos différents cas, mais ce n'est qu'une intuition puisque nous n'avons au final aucune information utile sur votre problème

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 93
    Points : 51
    Points
    51
    Par défaut
    Je crois vous avoir écrit ma requête dans le précédent message. Je travaille bien avec Access.
    J'ai essayé aussi cela :

    Code SQL : 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
    TRANSFORM ((tb2.total)+(tb1.total)) AS Expr2
     
    SELECT magasin.identifiant
     
    FROM objet INNER JOIN (magasin INNER JOIN m_s_o ON magasin.identifiant = m_s_o.identifiant) ON objet.numero = m_s_o.numero, 
    (SELECT Count(objet.numero) AS total, DatePart('ww',[objet].[date],2,1)-1 AS Expr1 
    FROM objet INNER JOIN (magasin INNER JOIN m_s_o ON magasin.identifiant = m_s_o.identifiant) ON objet.numero = m_s_o.numero 
    GROUP BY DatePart('ww',[objet].[date],2,1)
    )  AS tb1
     INNER JOIN
    (SELECT Count(objet.numero) AS total, DatePart('ww',[objet].[date],2,1)-1 AS Expr1
    FROM objet INNER JOIN (magasin INNER JOIN m_s_o ON magasin.identifiant = m_s_o.identifiant) ON objet.numero = m_s_o.numero 
     GROUP BY DatePart('ww',[objet].[date],2,1)
    )  AS tb2 
    ON tb1.Expr1 = tb2.Expr1
     
    GROUP BY magasin.identifiant
    PIVOT DatePart('ww',[objet].[date],2,1)-1;

    La différence tient dans le placement des COUNT à l'intérieur des sous requêtes ou en global.
    Le message d'erreur est le suivant "Votre requête n'inclut pas l'expression " ((tb2.total)+(tb1.total)) " spécifiée en tant que partie d'une fonction d'agrégation.

    Je vois à peu près de quoi vous parler, cela pourrait régler mon problème car je veux extraire des informations de type COUNT dans la même table ici objet mais avec différents WHERE.
    Cela fonctionne avec la première réponse que j'ai reçu dans ce sujet : j'obtiens alors mon COUNT grouper par le numéro de la semaine.
    Mais cela ne fonctionne plus quand j'essaye de le transformer en tableau croisé afin de grouper par numéro de semaine et magasin.

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 93
    Points : 51
    Points
    51
    Par défaut
    Je ne vois pas très bien la structure à faire avec des CASE et GROUP BY afin d'obtenir le résultat que je veux cad la somme de deux sous requetes groupé selon deux critères. Pourriez vous détailler cela svp ? si c'est bien la solution

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 93
    Points : 51
    Points
    51
    Par défaut
    Pour l'imaginer un peu plus :
    Nom : problème.png
Affichages : 241
Taille : 10,5 Ko
    Les deux petits cercles sont mes sous requêtes. Je souhaite compter toutes les données dedans et les regrouper en une seul requête en sommant les doublons et en affichant tous les éléments des deux sous requêtes.
    Le premier code que l'on m'a donné ne faisait pas cela à cause du INNER JOIN il n'affiche que les données présentes dans les deux requêtes pour le type magasin.

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 93
    Points : 51
    Points
    51
    Par défaut
    Problème résolu merci à ceux qui m'ont répondu pour votre aide !

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    TRANSFORM COUNT(T.objet.numero)
    SELECT  T.magasin.identifiant
    FROM 
    (
    SELECT objet.numero , magasin.identifiant, objet.date FROM objet INNER JOIN (magasin INNER JOIN m_s_o ON magasin.identifiant = m_s_o.identifiant) ON objet.numero = m_s_o.numero
    WHERE objet.Mvt = 101
    UNION ALL
    SELECT objet.numero, magasin.identifiant, objet.date FROM objet INNER JOIN (magasin INNER JOIN m_s_o ON magasin.identifiant = m_s_o.identifiant) ON objet.numero = m_s_o.numero
     
    WHERE objet.Mvt = 281
    )  AS T
    GROUP BY  T.magasin.identifiant
    PIVOT DatePart('ww',T.objet.date,2,1)-1 ;

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

Discussions similaires

  1. Problèmes exercice avec des sous-requêtes
    Par kopbuc dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/10/2015, 14h00
  2. Problème pour relier des sous-requêtes
    Par chart dans le forum Requêtes
    Réponses: 4
    Dernier message: 31/07/2014, 14h00
  3. [SBI QBE] Utilisation des sous-requêtes dans le QBE
    Par coyote35 dans le forum SpagoBI
    Réponses: 0
    Dernier message: 30/01/2013, 10h52
  4. Utiliser une jointure ou des sous-requêtes
    Par seabs dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/03/2011, 21h02
  5. Problème avec des sous requêtes
    Par nicocolt dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/10/2007, 15h19

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