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 :

Requête complexe ?


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Points : 31
    Points
    31
    Par défaut Requête complexe ?
    Bonjour à tous,

    voici mon soucis

    je dispose d'un certain nombre de table :

    je ne peux re-écrire l'ensemble des tables bien trop grande pour effectuer ma requête cependant je pense savoir quel sont les champs à utiliser.

    Table orders : id_order, date_purchased, orders_id_transporteur
    Table transport : id, colissimo, chrono, standard, express, gb, gbd, pt_retrait...

    Ma requête doit me retourner quelque chose comme ça (une ligne par commande)

    Date | n° commande | Transporteur (ex colissimo) | prix

    Exemple

    Janvier | WW138484AX | colissimo | 7
    Janvier | AA3449595II | chrono | 14

    etc...

    Edit : Je viens d'avoir des infos supplémentaires et qui n'ont rien avoir par rapport à ma première question... donc j'ai modifié en conséquence

    je séléctionne ici l'ensemble des commandes pour le mois de janvier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT o.`date_purchased`, o.`orders_id`, o.`orders_id_transporteur`, t.`id` 
    FROM orders o, transport t
    WHERE o.orders_id_transporteur = t.id
    AND o.`date_purchased` LIKE '2008-01%'
    j'ai donc :

    Date | n°commande |

    je fais une jointure avec la table transport maintenant j'aimerai savoir comment faire pour
    que l'order_id_transport me donne l'équivalence des champs (colissimo, chrono etc...)
    Ma table transport étant sous forme de matrice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    id colissimo chrono standard express gb etc...
    0      11,9        14         -1         -1        -1
    1      4,9          9,9
    2
    3
    4
    5
    etc
    J'espère être clair, merci de vos réponses

    Nick

  2. #2
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Je ne comprends pas à quoi correspond la table transport.
    Pourquoi y a t-il une colonne par type de transport au lieu d'une colonne type_transport ?
    A quoi correspondent les nombres dans ces colonnes ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Points : 31
    Points
    31
    Par défaut
    Merci de ta réponse

    Après recherche il n'y a pas besoin d'utiliser cette table transport.

    chaque transporteur dispose d'un code EAN ! ce qui simplifie la chose

    je viens de me remettre dessus

    si je bloque je rebip

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Points : 31
    Points
    31
    Par défaut
    J'en reviens à ma requête

    toujours dans le but d'avoir un résultat de ce genre :

    Exemple

    Janvier | WW138484AX | colissimo | 7
    Janvier | AA3449595II | chrono | 14

    j'utilise maintenant une autre table que celle transport.

    La table orders avec: orders_id, date_purchased
    La table products avec : products_id, products_ean

    je dispose des codes ean des transporteurs qui sont en fait des produits avec un code ean

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT o.`date_purchased`, o.`orders_id`, p.`products_id`, p.`products_ean`, p.`products_price`  
    FROM orders o, products p
    WHERE o.orders_id = p.products_id
    AND p.products_ean = 4242000013253
    Je vois pas trop comment sélectionner l'ensemble des codes ean des transporteurs afin d'en sortir comme le résultat voulu

    Date | N°commande | transporteur | prix

    le but étant de sortir une ligne par commande comme l'exemple ci-dessus

    Merci

  5. #5
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    N'y a t-il pas un product_type ou un truc dans le genre qui permettrait de savoir quels ean sont ceux des transporteurs ? Ou un formatage de cet ean qui dirait par exemple que tous les ean des transporteurs sont de la forme 4242% ?

    Au passage, les jointures normalisées, c'est mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT o.`date_purchased`, o.`orders_id`, p.`products_id`, p.`products_ean`, p.`products_price`  
    FROM orders o
    INNER JOIN products p ON o.orders_id = p.products_id
    WHERE p.products_ean = 4242000013253

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Points : 31
    Points
    31
    Par défaut
    Oui pour les jointures normalisées

    J'ai bien un products_model qui va me donner le nom du code EAN (genre colissimo, ou chrono) mais c'est trop vaste (du fait des noms donnés)

    en cherchant la j'ai un products_family et après vérif ça correspond à DIVE pour l'ensemble des transporteurs

    Pour la structures ean effectivement l'ensemble commence par 4242 mais après vérif en fait l'ensemble des produits commencent par 4242

    ayant été définit ainsi chaque transporteur correspond à un produit.

  7. #7
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Un truc qui m'étonne dans ta requête :
    - products_id est l'identifiant du produit ?
    - orders_id est l'identifiant de la commande ?

    Pourquoi faire une jointure sur les deux ?

    J'ai vraiment du mal à comprendre le schéma de ta BDD !

    Un descriptif des tables et un problème clairement posé nous aideraient à t'aider.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Points : 31
    Points
    31
    Par défaut
    Orders_id correspond à l'identifiant de la commande
    products_id àl'identifiant d'un produit

    je vais reprendre clairement ce que j'aurai du faire depuis le début

    Donc

    Je vais cibler les tables qui me sont nécessaire pour obtenir le résultat voulu soit :

    En une requête retourner une commande par ligne ainsi constituée

    La Date de la cde passée| le N° de commande | Le transporteur | le prix du transporteur

    Je dispose donc des tables suivantes :
    Orders et products étant grandes je limite aux champs dont je pense avoir besoin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Orders  
    
    orders_id
    date_purchased
    orders_id_transporteur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    products
    
    products_id
    products_ean
    products_quantity
    products_model
    products_mark
    products_price
    products_rayon
    products_family
    il existe une table intermédiaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    orders_products
     
    orders_products_id
    orders_products_status
    orders_products_id_transporteur
    orders_id
    products_id
    products_model
    products_name
    products_price
    final_price
    products_tax
    products_quantity
    A savoir qu'un transporteur est un produit et dispose d'un code EAN
    ils appartiennent à la famille DIVE

    le tout est pour être exporter dans un fichier csv

    j'espère que c'est plus clair merci

    Edit : je ne pense pas que la table orders_produtcs soit nécessaire.
    Pour complément d'information :

    la date correspond à la date à laquelle la commande à été passée. (date_purchased)
    Le N° de commande correspond a un id qui a été créé de la façon suivante AA123456BB
    (orders_id)

  9. #9
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Quels sont les liens entre ces tables car pour le coup j'y comprends encore moins que CinePhil je crois

    Pourquoi avoir une telle redondance des données ?


  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Points : 31
    Points
    31
    Par défaut
    En fait la table orders_products est inutile

    je pense que les deux autres sont suffisantes pour faire la requête ?

  11. #11
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT o.date_purchased, o.orders_id, o.orders_id_transporteur, p.products_price
    FROM orders o
    INNER JOIN products p ON o.orders_id_transporteur = p.products_id

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Points : 31
    Points
    31
    Par défaut
    Merci de ta réponse et pour ton aide

    (merci également à uramus et lyche ) en complétant la requête fini par me donner le résultat voulu !

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Points : 31
    Points
    31
    Par défaut
    Re bonjour,

    voila j'en reviens avec une nouvelle requête je me permet de répondre à ce poste car j'utilise les mêmes tables :

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT o.date_purchased, o.orders_id, SUM(op.final_price) as total, ped.famille
    		FROM products_erp_data ped
    		LEFT JOIN products p ON ped.ean=p.products_ean
    		INNER JOIN  orders_products op ON p.products_id=op.products_id
    		INNER JOIN orders o ON op.orders_id=o.orders_id
    		WHERE ped.`famille` IN ("PHOT","INFO","HFES","HFCH","GSM","CASQ","CAME","AUDI","TELE","TFIX","TGSM")
    		AND (o.`payment_method` = "Carte de Crédit" OR o.`payment_method`="ReceiveAndPay")
    		AND o.date_purchased BETWEEN '2008-01-28' AND '2008-12-31'
    		AND o.orders_id LIKE '%AA'
    		GROUP BY o.orders_id, ped.famille

    Le but de la requête étant de me sortir la commande sont total et les familles.

    Voici le résultat.

    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
    date_purchased	orders_id	total	famille
    28/01/08 17:36	KT198118AA	1348.9900	TELE
    28/01/08 20:39	KT198619AA	110.0900	AUDI
    28/01/08 21:04	KT199191AA	593.9900	TELE
    28/01/08 11:18	KT199557AA	1848.0000	TELE
    28/01/08 00:04	KT199646AA	899.9900	TELE
    28/01/08 08:36	KT199660AA	270.2900	HFES
    28/01/08 09:16	KT199671AA	770.9900	HFES
    28/01/08 10:47	KT199701AA	172.0200	INFO
    28/01/08 11:08	KT199704AA	1388.9900	TELE
    28/01/08 11:16	KT199710AA	770.9900	HFES
    28/01/08 11:48	KT199716AA	233.9900	HFES
    28/01/08 12:02	KT199719AA	28.0900	AUDI
    28/01/08 12:38	KT199725AA	770.9900	HFES
    28/01/08 14:06	KT199740AA	40.0200	TFIX
    28/01/08 16:11	KT199761AA	907.9900	TELE
    28/01/08 16:10	KT199772AA	26.0200	CASQ
    28/01/08 16:18	KT199775AA	19.9900	AUDI

    Ma question maintenant

    Mon problème étant qu'une commande peut contenir plusieurs produits

    Des produits qui font parti de la blackliste (risqué) et des produits non risqué

    Donc il faudrait que je puisse sélectionner l'ensemble des commandes et éliminer les lignes des produits qui font parti des familles risquées.

    J'en sais donc un peu plus sur la bdd :

    les tables que j'utilise : (je reprends celle du haut)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Orders :
     
    orders_id
    date_purchased
    orders_id_transporteur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    products
     
    products_id
    products_ean
    products_quantity
    products_model
    products_mark
    products_price
    products_rayon
    products_family

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    orders_products
     
    orders_products_id
    orders_products_status
    orders_products_id_transporteur
    orders_id
    products_id
    products_model
    products_name
    products_price
    final_price
    products_tax
    products_quantity
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    products_erp_data
     
    ean
    famille

    La table orders_products permet en fait de créer les lignes de commande pour une commande

    Donc voila ma requête ne retourne pas je pense ce qu'il faut !

    Merci

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Points : 31
    Points
    31
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT o.`date_purchased`, o.`orders_id`, op.final_price, ped.famille 
    FROM products_erp_data ped
    INNER JOIN products p ON ped.ean=p.products_ean
    INNER JOIN  orders_products op ON p.products_id=op.products_id
    INNER JOIN orders o ON op.orders_id=o.orders_id
    WHERE o.date_purchased BETWEEN '2008-01-28' AND '2008-12-30'
    AND ped.`famille` NOT IN ("PHOT","INFO","HFES","HFCH","GSM","CASQ","CAME","AUDI","TELE","TFIX","TGSM")
    AND o.orders_id LIKE '%AA'
    AND (o.`payment_method` = "Carte de Crédit")
    GROUP BY op.orders_products_id, o.orders_id
    Je pense que j'ai trouvé pour répondre à ma question...

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

Discussions similaires

  1. [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, 15h12
  2. Requête complexe
    Par Yali dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/01/2005, 10h19
  3. 3 tables avec requête complexe
    Par yamino dans le forum Langage SQL
    Réponses: 6
    Dernier message: 25/03/2004, 20h50
  4. Encore une requête complexe sur plusieurs tables
    Par DenPro dans le forum Langage SQL
    Réponses: 5
    Dernier message: 09/12/2003, 20h05
  5. Requête complexe sur plusieurs table
    Par DenPro dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/11/2003, 18h50

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