Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2068 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Tri et calcul entre deux tables MySQL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Tri et calcul entre deux tables MySQL

n°1398730
Triple T
Posté le 02-07-2006 à 02:02:11  profilanswer
 

Bonjour tout le monde,
 
Ca fait quelques heures que je cherche desesperement comment sortir une stat entre les champs de deux tables, voici la structure des tables:
 
table1:
fab_id, prod_id, prod_qte
100, 1, 2000
101, 3, 1000
102, 1, 1000
103, 2, 4000
 
table2:
vente_id, prod_id, prod_qte
101, 2, 3000
102, 3, 1000
103, 1, 1000
104, 1, 1000
 
table3:  
prod_id, prod_desc
1, produit1
2, produit2
3, produit3
 
Ce que je cherche a obtenir c'est le resultat suivant:
 
table3.prod_desc, table1.prod_qte, table2.prod_qte, difference
produit1, 3000, 2000, 1000
produit2, 4000, 3000, 1000
produit3, 1000, 1000, 0
 
Avec le code suivant j'ai reussi a trier et additionner les differents produits pour une des tables, la ou je seche, c'est comment faire pour appliquer ce code sur les deux tables et ensuite faire la soustraction ou difference... je suis plutot dans la categorie des debutants avec le SQL, et la je commence a craquer :-( je sais plus ou chercher !
 
SELECT produits.prod_desc, SUM(prod_qte/1000) AS litres FROM hist_ventes, produits
 WHERE (hist_ventes.prod_id = produits.prod_id)
GROUP BY hist_ventes.prod_id
ORDER BY produits.prod_desc, hist_ventes.date_vente
 

mood
Publicité
Posté le 02-07-2006 à 02:02:11  profilanswer
 

n°1398733
mrbebert
Posté le 02-07-2006 à 02:50:59  profilanswer
 

On va bien décomposer les trucs, tu va voir, ca va aller tout seul :D  
On prend :
- une tb_fab qui fera la somme, par produit, des produits fabriqués
- une tb_vend qui fera la somme, par produit, des produits vendus
 
Ca va donner un truc dans le genre ;
 
SELECT table3.prod_desc, IFNULL(tb_fab.fab_sum, 0) AS fab_qte, IFNULL(tb_vend.vend_sum, 0) AS vend_qte, (fab_qte-vend_qte) AS difference
FROM table3
LEFT JOIN (
  SELECT prod_id, SUM(prod_qte) AS fab_sum FROM table1 GROUP BY prod_id
  ) AS tb_fab ON table3.prod_id=tb_fab.prod_id
LEFT JOIN (
  SELECT prod_id, SUM(prod_qte) AS vend_sum FROM table2 GROUP BY prod_id
  ) AS tb_vend ON table3.prod_id=tb_vend.prod_id
ORDER BY table3.prod_id
 
N'ayant pas de MySQL à portée de clavier, c'est surement bourré de faute de syntaxe mais je pense que l'idée y est :)

n°1398780
Beegee
Posté le 02-07-2006 à 13:16:56  profilanswer
 

Plus simplement :
 

Code :
  1. SELECT p.prod_desc,
  2.        SUM(hf.prod_qte) AS qte_fabriquee,
  3.        SUM(hv.prod_qte) AS qte_vendue,
  4.        SUM(hf.prod_qte) - SUM(hv.prod_qte) AS difference
  5. FROM produits p
  6. LEFT JOIN hist_ventes hv ON
  7. LEFT JOIN hist_fab hf ON
  8. WHERE hv.prod_id = p.prod_id
  9. AND hf.prod_id = p.prod_id
  10. GROUP BY p.prod_desc;

n°1398816
Triple T
Posté le 02-07-2006 à 15:17:29  profilanswer
 

mrbebert a écrit :

On va bien décomposer les trucs, tu va voir, ca va aller tout seul :D  
On prend :
- une tb_fab qui fera la somme, par produit, des produits fabriqués
- une tb_vend qui fera la somme, par produit, des produits vendus
 
Ca va donner un truc dans le genre ;
 
SELECT table3.prod_desc, IFNULL(tb_fab.fab_sum, 0) AS fab_qte, IFNULL(tb_vend.vend_sum, 0) AS vend_qte, (fab_qte-vend_qte) AS difference
FROM table3
LEFT JOIN (
  SELECT prod_id, SUM(prod_qte) AS fab_sum FROM table1 GROUP BY prod_id
  ) AS tb_fab ON table3.prod_id=tb_fab.prod_id
LEFT JOIN (
  SELECT prod_id, SUM(prod_qte) AS vend_sum FROM table2 GROUP BY prod_id
  ) AS tb_vend ON table3.prod_id=tb_vend.prod_id
ORDER BY table3.prod_id
 
N'ayant pas de MySQL à portée de clavier, c'est surement bourré de faute de syntaxe mais je pense que l'idée y est :)


 
Merci pour la reponse, j'ai essaye avec ce code, j'ai juste change les noms des tables pour correspondre a la base.
 
Il me fait une erreur en me disant que "fab_qte" est inconnu, j'ai beau regarder le code je vois pas pourquoi !

n°1398818
Triple T
Posté le 02-07-2006 à 15:19:46  profilanswer
 

Beegee a écrit :

Plus simplement :
 

Code :
  1. SELECT p.prod_desc,
  2.        SUM(hf.prod_qte) AS qte_fabriquee,
  3.        SUM(hv.prod_qte) AS qte_vendue,
  4.        SUM(hf.prod_qte) - SUM(hv.prod_qte) AS difference
  5. FROM produits p
  6. LEFT JOIN hist_ventes hv ON
  7. LEFT JOIN hist_fabrication hf ON
  8. WHERE hv.prod_id = p.prod_id
  9. AND hf.prod_id = p.prod_id
  10. GROUP BY p.prod_desc;



 
J'ai egalement essaye ce code, il y a un truc que le MySQL n'apprecie pas avec la commande JOIN, dans le doute j'ai change ma version de MySQL et je suis passe de la 4.1.9 a la 5, meme resultat !?

n°1398820
Beegee
Posté le 02-07-2006 à 15:23:10  profilanswer
 

Désolé, j'avais pas fini la requête ;)
 

Code :
  1. SELECT p.prod_desc,
  2.        SUM(hf.prod_qte) AS qte_fabriquee,
  3.        SUM(hv.prod_qte) AS qte_vendue,
  4.        SUM(hf.prod_qte) - SUM(hv.prod_qte) AS difference
  5. FROM produits p
  6. LEFT JOIN hist_ventes hv ON hv.prod_id = p.prod_id
  7. LEFT JOIN hist_fab hf ON hf.prod_id = p.prod_id
  8. GROUP BY p.prod_desc
  9. ORDER BY p.prod_desc;

Message cité 1 fois
Message édité par Beegee le 02-07-2006 à 15:23:43
n°1398823
mrbebert
Posté le 02-07-2006 à 15:28:42  profilanswer
 

Triple T a écrit :

Merci pour la reponse, j'ai essaye avec ce code, j'ai juste change les noms des tables pour correspondre a la base.
 
Il me fait une erreur en me disant que "fab_qte" est inconnu, j'ai beau regarder le code je vois pas pourquoi !

Curieux [:figti]  
Ca doit être dans le calcul de la colonne "difference". Faut peut être réécrire le SELECT de cette manière :
SELECT table3.prod_desc
  , IFNULL(tb_fab.fab_sum, 0) AS fab_qte
  , IFNULL(tb_vend.vend_sum, 0) AS vend_qte
  , (IFNULL(tb_fab.fab_sum, 0)-IFNULL(tb_vend.vend_sum, 0)) AS difference

n°1398849
Triple T
Posté le 02-07-2006 à 16:42:31  profilanswer
 

Beegee a écrit :

Désolé, j'avais pas fini la requête ;)
 

Code :
  1. SELECT p.prod_desc,
  2.        SUM(hf.prod_qte) AS qte_fabriquee,
  3.        SUM(hv.prod_qte) AS qte_vendue,
  4.        SUM(hf.prod_qte) - SUM(hv.prod_qte) AS difference
  5. FROM produits p
  6. LEFT JOIN hist_ventes hv ON hv.prod_id = p.prod_id
  7. LEFT JOIN hist_fab hf ON hf.prod_id = p.prod_id
  8. GROUP BY p.prod_desc
  9. ORDER BY p.prod_desc;



 
Maintenant le code passe sans erreur, par contre les donnees extraites sont erronees !?

n°1398850
Triple T
Posté le 02-07-2006 à 16:46:38  profilanswer
 

mrbebert a écrit :

Curieux [:figti]  
Ca doit être dans le calcul de la colonne "difference". Faut peut être réécrire le SELECT de cette manière :
SELECT table3.prod_desc
  , IFNULL(tb_fab.fab_sum, 0) AS fab_qte
  , IFNULL(tb_vend.vend_sum, 0) AS vend_qte
  , (IFNULL(tb_fab.fab_sum, 0)-IFNULL(tb_vend.vend_sum, 0)) AS difference


 
J'ai corrige le code avec ces indications, et tout fonctionne, il semblerais donc que MySQL soit chatouilleux sur la syntaxe.
 
Merci pour tout, apres quelques heures de prise de tete c'est un soulagement de voir apparaitre les donnees  :)  :)  
 
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Tri et calcul entre deux tables MySQL

 

Sujets relatifs
Calcul de valeurs propres[MySQL] Fonction recherche complexe
probleme de requete sur 3 tablesProbleme Mysql
[PHP / MySQL] Moteur de rechercheAccents/Points d'interrogation en PHP/MySql
Connexion à MySQLbase de données MYSQL avec champs verticaux
MySQL - sélectionner le premier enregistrement d'une tableversion client mysql utilisé par PHP
Plus de sujets relatifs à : Tri et calcul entre deux tables MySQL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR