2008-10-28 14 views
5

Ich habe zwei Tabellen, eine speichert die Produkte und die Menge, die wir gekauft haben, die anderen speichert die verkauft. Der aktuelle Bestand ist daher die Summe aller Mengenspalten in der gekauften Tabelle abzüglich der Anzahl der Zeilen in der Tabelle sales. Wie kann dies in MySQL ausgedrückt werden? Denken Sie daran, dass es viele verschiedene Produkte gibt.Unterschied in der Anzahl der Zeilen von zwei Tabellen in MySQL zu finden

EDIT: Um es schwieriger zu machen, habe ich eine andere Anforderung. Ich habe den gekauften Tisch, den verkauften Tisch, aber ich habe auch den Produkttisch. Ich möchte eine Liste aller Produkte und möchte die verfügbare Menge jedes Produkts wissen. Das Problem mit den aktuellen Antworten ist, dass sie nur die Produkte zurückgeben, die wir bereits verkauft oder gekauft haben. Ich möchte alle Produkte.

+0

Summe http://stackoverflow.com/questions/826365/how-do-i-add-two-count-results-together-on-two-different-tables –

Antwort

6

Versuchen Sie, diese


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) 

Dies ist eine bessere Lösung als ein paar von den anderen geschrieben, die die Tatsache berücksichtigen nicht, dass einige Produkte keine entsprechenden Zeilen in der Verkaufstisch haben. Sie möchten sicherstellen, dass solche Produkte auch in den Ergebnissen angezeigt werden.

NVL ist eine Oracle-spezifische Funktion, die den Wert des ersten Arguments zurückgibt, es sei denn, es ist null, in diesem Fall gibt es den Wert des zweiten Arguments zurück. Es gibt äquivalente Funktionen in allen kommerziellen DBMS - Sie können CASE in MySQL mit demselben Effekt verwenden.

+0

Ich glaube, Sie bedeutete inv_t.product in der ersten Zeile. – Marius

+0

Es zeigt auch kein Produkt, das noch nicht verkauft wurde. – Marius

+0

Danke für den Haken, behoben. Es zeigt ein Produkt, das nicht verkauft wurde, deshalb ist es eine äußere Verbindung. Ich habe einen nvl() - Aufruf hinzugefügt, um klarzustellen, dass dies genau so sein sollte. – 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; 

Dieser funktioniert auch, wenn verkaufte Menge ist 0.

0

Ich schlage vor, dass das „Inventar“ und „Umsatz“ Tabellen in Aussicht, so dass sie wiederverwendbar sind und die endgültige Abfrage wird sehr einfach . Offensichtlich müssen sich die Feld- und Tabellennamen ändern, damit sie mit Ihrem Schema übereinstimmen.

--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; 
Verwandte Themen