Tri et calcul entre deux tables MySQL

Tri et calcul entre deux tables MySQL - SQL/NoSQL - Programmation

Marsh Posté le 02-07-2006 à 02:02:11    

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
 

Reply

Marsh Posté le 02-07-2006 à 02:02:11   

Reply

Marsh Posté le 02-07-2006 à 02:50:59    

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 :)

Reply

Marsh Posté le 02-07-2006 à 13:16:56    

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;

Reply

Marsh Posté le 02-07-2006 à 15:17:29    

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 !

Reply

Marsh Posté le 02-07-2006 à 15:19:46    

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 !?

Reply

Marsh Posté le 02-07-2006 à 15:23:10    

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
Reply

Marsh Posté le 02-07-2006 à 15:28:42    

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

Reply

Marsh Posté le 02-07-2006 à 16:42:31    

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 !?

Reply

Marsh Posté le 02-07-2006 à 16:46:38    

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  :)  :)  
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed