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 :

Probléme sur une requête SQL


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2012
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Probléme sur une requête SQL
    Bonjour,

    je vous montre une première requête SQL de laquelle je dois m'inspirer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select count(distinct(a.clientid||a.productid)), d.label
    from bopro.pjspviwf a, bopro.pjspvi_pjsplace b, bopro.pjsplace c, activities d
    where a.state <> 1 and b.clientid = a.clientid and b.id = a.productid and
    c.clientid = b.clientid and c.id = b.placeid and d.id = c.section
    group by d.label
    order by count(distinct(a.clientid||a.productid)) desc, d.label asc
    les conditions ne sont pas vraiment importantes, mais cette requête me fournit pour chaque label ( secteur d'activité ) le nombre de sites web.

    Maintenant on me demande de faire une requête similaire mais de faire la différence parmi le nombre de site web de type A et de type B.

    Pour avoir le type je peux le recuperer grâce à ceci :

    e.lowcost ( soit a 1 ou a 0) de la table pjspvi e

    Donc je voudrais obtenir un tableau ressemblant à ca :

    Secteur      nb type a   nb type b
    resto            25             30
    fleuriste        10             12
    J'ai beau avoir cherché plein de solution je n'ai pas trouvé la fonction ou la synthaxe exact pour arrivé a ce que je voulais. Le seul truc qui se rapproche le plus c'est ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select count(distinct(a.clientid||a.productid)) AS "PVI", (select count(distinct(f.clientid||f.productid ))
    from bopro.pjspviwf f, bopro.pjspvi_pjsplace g, bopro.pjsplace h, activities i, pjspvi j
     
    where f.state <> 1 and g.clientid = f.clientid and g.id = f.productid and
    h.clientid = g.clientid and h.id = g.placeid and i.id = h.section and f.clientid=j.clientid and j.lowcost=0 
     
    ),d.label 
    from bopro.pjspviwf a, bopro.pjspvi_pjsplace b, bopro.pjsplace c, activities d, pjspvi e
     
    where a.state <> 1 and b.clientid = a.clientid and b.id = a.productid and
    c.clientid = b.clientid and c.id = b.placeid and d.id = c.section and a.clientid=e.clientid and e.lowcost=1
    group by d.label
    order by count(distinct(a.clientid||a.productid)) desc, d.label asc
    Mais le souci c'est que ça marche pour le premier type, mais pour le 2ème type il m'affiche la somme de tous les sites type B tous secteurs confondus sur chaque secteur. Qu'est-ce que j'ai pu oublier de mettre pour qu'il me trie bien le 2ème.


    Merci d'avance.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Les jointures s'écrivent depuis 20 ans avec l'opérateur JOIN ; il serait temps de s'y mettre !

    Voici la première requête récrite correctement :
    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 count(DISTINCT(a.clientid||a.productid)), d.label
    FROM bopro.pjspviwf a
    INNER JOIN bopro.pjspvi_pjsplace b
    	ON b.clientid = a.clientid
    	AND b.id = a.productid
     
    	INNER JOIN bopro.pjsplace c
    		ON c.clientid = b.clientid
    		AND c.id = b.placeid
     
    		INNER JOIN activities d ON d.id = c.section
    WHERE a.state <> 1
    GROUP BY d.label
    ORDER BY count(DISTINCT(a.clientid||a.productid)) DESC, d.label ASC
    Du fait du COUNT(DISTINCT), je crains qu'il ne faille faire une jointure de la requête avec elle-même en changeant juste la condition sur le lowcost :
    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
    37
    38
    39
    40
    SELECT t1.label, t1.nombre_lowcost, t2.nombre_pas_lowcost
    FROM
    (
    	SELECT d.label,
    		count(DISTINCT(a.clientid||a.productid)) AS nombre_lowcost
    	FROM bopro.pjspviwf a
    	INNER JOIN bopro.pjspvi_pjsplace b
    		ON b.clientid = a.clientid
    		AND b.id = a.productid
     
    		INNER JOIN bopro.pjsplace c
    			ON c.clientid = b.clientid
    			AND c.id = b.placeid
     
    			INNER JOIN activities d ON d.id = c.section
    	INNER JOIN pjspvi e ON a.clientid=e.clientid
    	WHERE a.state <> 1
    		AND e.lowcost = 1
    	GROUP BY d.label
    ) t1
    INNER JOIN
    (
    	SELECT d.label,
    		count(DISTINCT(a.clientid||a.productid)) AS nombre_lowcost
    	FROM bopro.pjspviwf a
    	INNER JOIN bopro.pjspvi_pjsplace b
    		ON b.clientid = a.clientid
    		AND b.id = a.productid
     
    		INNER JOIN bopro.pjsplace c
    			ON c.clientid = b.clientid
    			AND c.id = b.placeid
     
    			INNER JOIN activities d ON d.id = c.section
    	INNER JOIN pjspvi e ON a.clientid=e.clientid
    	WHERE a.state <> 1
    		AND e.lowcost = 0
    	GROUP BY d.label
    ) t2 ON t1.label = t2.label
    ORDER BY t1.nombre_lowcost, t2.nombre_pas_lowcost
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2012
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Merci ça fonctionne à la perfection.

    En fait je viens juste de démarrer mon alternance et je n'ai pas encore commencé les cours. Donc les souvenirs de SQL sont bien lointains, je cherchais sur Google quelle fonction utiliser. Mais comme je n'avais qu'une requête de base pour m'inspirer et que celle-ci n'était pas très claire, je ne savais pas où donner de la tête.

    Merci encore.

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

Discussions similaires

  1. [MySQL] Problème sur une requête SQL
    Par julienmop dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 14/06/2015, 21h47
  2. Problème sur une requête SQL
    Par Jezlife dans le forum Bases de données
    Réponses: 8
    Dernier message: 18/03/2012, 10h35
  3. Problème sur une requête SQL
    Par juju05 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 20/06/2010, 18h20
  4. Problème sur une requête SQL (PL/SQL)
    Par goofyrocks dans le forum Langage SQL
    Réponses: 5
    Dernier message: 13/01/2009, 17h33
  5. Problème de SUM sur une requête SQL
    Par Lapicure dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 12/06/2007, 11h51

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