2013-05-29 4 views
2

Mon projet concerne une bijouterie et j'essaie de trouver le produxt avec le max Profit.Comment trouver Profit entre 3 tables différentes

J'ai 3 tables qui me donne l'info:

VENTES Tableau:

salesid productid Quantity Price 
11001 13001  4  5 
11002 13002  6  10 
11003 13003  5  16 
. 
. 
11012 13012  7  15 

table RETOUR:

salesid productid Quantity Price 
11003 13003  1  16 
11007 13007  3  12 
11008 13008  3  8 

table ACHATS:

procurementid productid Quantity Price 
100001   13001  10  2 
100002   13002  10  2 
. 
. 
100012   13012  10  2 

Le bénéfice est donné à partir de est la formule:

Profit = Quantité * Prix (vente) - Quantité * Prix (Retour) - Quantité * Prix (achats)

Et est maintenant le problème ici. Je suis venu à ce jusqu'à présent

select a.productid,(a.quantity*a.price-b.quantity*b.price-c.quantity*c.price) as Profit 
from sales as a ,return as b ,procurement as c 
where a.productid = c.productid 
GROUP BY productid 

Dans cette situation, je ne reçois pas la bonne réponse. C'est parce que dans la table de retour je n'ai que 3 registres mais sur les autres tables j'en ai 12, donc quand il calcule le profit il utilise la table de retour entière pour chaque rangée des autres tables.

J'ai essayé d'utiliser max(Profit) mais il n'a rien fait.

En fait, je ne sais pas comment je peux connecter les 3 registres de la table de retour afin qu'ils ne soient utilisés que lorsqu'ils le doivent. Quand j'ai essayé les jointures, beaucoup de lignes étaient nulles. Je pense que quelque chose doit être fait avec OUTER JOIN ou quelque chose mais je ne sais pas quoi faire.

Répondre

0

On dirait que vous avez besoin d'utiliser un LEFT JOIN sur votre table de retour car il a seulement 3 des produits et les autres tables ont tous 12.

select a.productid, 
    (a.quantity*a.price-coalesce(b.quantity,0)*coalesce(b.price,0)-c.quantity*c.price) as Profit 
from sales a 
    join procurement c on a.productid = c.productid 
    left join return b on a.salesid = b.salesid 
group by a.productid 

Il utilise également COALESCE changer NULL valeurs à 0.

+0

<3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 – user2432398

+0

@ user2432398 - np, content de pouvoir aider. BTW - Je n'étais pas tout à fait sûr si vous avez besoin d'utiliser SUM - si vous avez seulement les 12 enregistrements dans vos tables (une relation 1-1), alors vous n'aurez pas besoin d'agrégats. Si toutefois votre tableau des ventes peut contenir plusieurs enregistrements par produit, examinez la réponse de Gordon en utilisant SUM. Sincères amitiés. – sgeddes

2

Vous semblez être plutôt nouveau à SQL. Lorsque vous donnez des alias aux tables, essayez d'utiliser les abréviations des tables. Cela rend les requêtes beaucoup plus faciles à lire (par exemple, p pour procurement et s pour les ventes).

De même, vous devez apprendre la syntaxe de jointure appropriée. Cependant, cela ne vous aidera pas vraiment ici, car vous devez pré-agréger avant de faire les jointures. Cela est, obtenir le coût, les ventes et le retour des montants séparément, puis les réunir:

select p.productid, 
     (coalesce(s.rev, 0) - coalesce(r.ret, 0) - coalesce(p.cost, 0)) as profit 
from (select p.productid, SUM(quantity*price) as cost 
     from procurement p 
     group by p.productid 
    ) p left outer join 
    (select s.productid, sum(quantity*price) as rev 
     from sales s 
     group by s.productid 
    ) s 
    on p.productid = s.productid 
    (select r.productid, sum(quantity*price) as ret 
     from return 
     group by s.productid 
    ) r 
    on p.productid = r.productid; 

Cette requête utilise également un left outer join. Ceci est important car tous les produits ne peuvent pas avoir de ventes ou de retours. Vous ne voulez pas les perdre, juste parce qu'ils sont des vendeurs minables (pas de ventes) ou suprêmement populaires (pas de retours).

+0

Je suis d'accord avec cette affiche, l'identifiant de produit de la table d'approvisionnement doit être utilisé. vous pouvez avoir aucune vente ont l'approvisionnement .... –

+0

+1. Excellente explication. – William

+0

je l'ai trouvé c'est vraiment VRAIMENT HELPFULL .. je suis si proche de la réponse maintenant mais voici le problème: je peux voir tout le productid dans la colonne, mais à la colonne de profit je peux seulement voir les 3 registres que j'ai dans la table de retour et tous les autres sont NULL – user2432398

0

Vous voulez faire une jointure externe gauche des ventes aux retours. (Vous pouvez avoir des ventes sans retour, mais il ne devrait y avoir aucun retour lorsque vous n'avez pas de ventes.)

et vous voulez jointure externe droite achats à cette table comined (parce que l'approvisionnement n'a pas gurantee ventes, mais vous ne pouvez pas vendre des choses que vous n'avez pas.)

select c.productid, 
(a.quantity*a.price-b.quantity*b.price-c.quantity*c.price) as Profit 
from (sales as a LEFT JOIN return as b ON a.productid = b.productid) 
RIGHT JOIN procurement as c ON a.productid = c.productid 
where a.productid = c.productid 
GROUP BY productid 

cela ne devrait pas avoir des valeurs nulles

Questions connexes