2008-10-28 17 views
5

J'ai deux tables, l'une stocke les produits et la quantité que nous avons achetés, l'autre stocke les ventes. Le stock actuel est donc la somme de toutes les colonnes de quantité dans la table achetée moins le nombre de lignes dans la table vendues. Comment cela peut-il être exprimé en MySQL? Rappelez-vous qu'il existe de nombreux produits différents.Trouver la différence dans le nombre de lignes de deux tables dans MySQL

EDIT: Pour le rendre plus difficile, j'ai une autre exigence. J'ai la table achetée, la table vendue, mais j'ai aussi la table des produits. Je veux une liste de tous les produits, et je veux connaître la quantité disponible de chaque produit. Le problème avec les réponses actuelles est qu'ils ne retournent que les produits que nous avons déjà vendus ou achetés. Je veux tous les produits.

+0

somme http://stackoverflow.com/questions/826365/how-do-i-add-two-count-results-together-on-two-different-tables~~V~~singular~~3rd –

Répondre

6

Essayez cette


SELECT inv_t.product_id, inventory_total-nvl(sales_total,0) 
FROM 
    (SELECT product_id, sum(quantity) as inventory_total 
    FROM inventory 
    GROUP BY product_id) inv_t LEFT OUTER JOIN 
    (SELECT product_id, count(*) AS sales_total 
    FROM sales 
    GROUP BY product_id) sale_t 
    ON (inv_t.product_id = sale_t.product_id) 

Ceci est une meilleure solution que quelques-unes des autres, ceux affichés qui ne tiennent pas compte du fait que certains produits peuvent ne pas avoir toutes les lignes correspondantes dans la table de vente. Vous voulez vous assurer que ces produits apparaissent également dans les résultats. NVL est une fonction spécifique à Oracle qui renvoie la valeur du premier argument, sauf si elle est nulle, auquel cas elle renvoie la valeur du second argument. Il existe des fonctions équivalentes dans tous les SGBD commerciaux - vous pouvez utiliser CASE dans MySQL dans le même but.

+0

Je pense que vous vouliez dire inv_t.product sur la première ligne. – Marius

+0

En outre, il ne montre pas un produit qui n'a pas encore été vendu. – Marius

+0

Merci pour la capture, corrigé. Il montre un produit qui n'a pas été vendu, c'est pourquoi c'est une jointure externe. J'ai ajouté un appel à nvl() pour préciser que c'est ce qui devrait se passer. – SquareCog

0
SELECT product AS prd, 
SUM(quantity) - 
    IFNULL((SELECT COUNT(*) 
    FROM sells 
    WHERE product = prd 
    GROUP BY product), 0) 
AS stock 
FROM bought 
GROUP BY product; 

Celui-ci fonctionne également lorsque la quantité vendue est 0.

0

Je suggère faire les tables « inventaire » et « ventes » en vue, afin qu'elles soient réutilisables et la requête finale devient très simple . Évidemment, les noms de champs et de tables devront changer pour correspondre à votre schéma.

--First view: list products and the purchased qty 
create or replace view product_purchases as 
select 
    product_id 
,sum(purchased_qty) as purchased_qty 
from 
    purchases 
group by 
    product_id; 

--Second view: list of products and the amount sold  
create or replace view product_sales as 
select 
    product_id 
,count(*) as sales_qty 
from 
    sales 
group by 
    product_id; 

--after creating those two views, run this query: 
select 
    pp.product_id 
,pp.purchased_qty - ps.sales_qty as on_hand_qty 
from 
    product_purchases pp 
,product_sales ps 
where ps.product_id = pp.product_id;