2017-03-19 1 views
-1

Für jedes Lager muss ich die geschätzte Menge jedes Produkts ermitteln. Diese Menge berechnet sich aus der Menge, die im letzten Lager verzeichnet wurde, abzüglich der Lieferungen seit dem letzten Lager, plus Nachlieferungen seit dem letzten Lager.Abfrage, um die Summe der empfangenen Produkte zu addieren und die Summe der ausgelieferten Produkte in das Inventar zu subtrahieren

Hier sind meine Einheiten:

-warehouse 
    location 
-inventory 
    date 
-product 
    name 
-inventory_product 
    quantity 
    warehouse_id 
    product_id 
    inventory_id 
-resupply 
    date 
-resupplying 
    resupply_id 
    product_id 
    warehouse_id 
    quantity 
-shipment 
    date 
-shipping 
    shipment_id 
    product_id 
    warehouse_id 
    quantity 

Ich bin von ... entlang der Linie von etwas denken

select distinctrow product.name, inventory_product.quantity - sum(shipping.quantity) as quantity 
from inventory 
inner join inventory_product on inventory.id = inventory_product.inventory_id 
inner join product on inventory.product_id = product.id 
inner join shipping on (inventory_product.warehouse_id = shipping.warehouse_id and inventory_product.product_id = shipping.product_id) 
inner join shipment on shipping.shipment_id = shipment.id 
where inventory.date <= shipment.date 
group by shipping.product_id; 

Aber ich kann nicht sehen, wie in der Wiederzuführgeräts Teil hinzuzufügen. ..

+1

Haben * Produkt *, * Inventar * und * Versand * Tabellen keine Schlüssel? Diese Abfrage ist in MS Access nicht gültig, da "JOIN" -Paarungen Klammern erfordern. Verwenden Sie den Abfrage-Designer, um zu helfen. – Parfait

+0

Alle Entitäten haben natürlich ID-Eigenschaften als Primärschlüssel. Ich habe keinen Zugriff und kann meine Abfrage nicht ausführen. Ich mache es, um jemandem zu helfen. – Stephane

+0

@nicomp Nun, ich helfe jemandem, indem ich Tage damit verbringe, ihm Datenbankdesign beizubringen, einschließlich Begriffe wie Primärschlüssel und Fremdschlüssel, für die ich Analogien wie eine Hausnummer auf einer Mailbox und die gleiche Nummer auf der Mail verwenden muss. Ich mache es, weil er dieses Projekt alleine nicht erreichen kann. In Bezug auf diese Anfrage habe ich einige Zeit damit verbracht, es zu erstellen, wie Sie in meiner Frage sehen können, aber ich konnte es nicht abschließen. Also, ja, ich bitte um Hilfe, um jemandem zu helfen, der diese Frage nicht einmal schreiben kann, geschweige denn, auf Englisch zu schreiben. – Stephane

Antwort

1

Überlegen Sie, ob Einheitsebene und aggregierte Ebenenteile getrennt werden, und fügen Sie sie für den endgültigen arithmetischen Ausdruck wieder zusammen. Speichern Sie alle als gespeicherte Abfragen, auf die in den anderen FROM/JOIN-Klauseln der Abfrage verwiesen wird.

Letzte Inventurdatum Abfrage(Aggregat von product_id)

SELECT i.product_id, Max(n.date) AS MaxInvDate 
FROM inventory AS n 
INNER JOIN inventory_product AS i ON n.id = i.inventory_id 
GROUP BY i.product_id; 

Versand Summe Abfrage(Summen Menge auf und nach oben ist MaxInvDate)

SELECT i.product_id, i.quantity AS inv_qty, idt.date AS inv_date, 
     SUM(s.quantity) AS shipment_qty  
FROM ((inventory_product i INNER JOIN inventory idt ON idt.id = i.inventory_id)  
INNER JOIN (shipping s INNER JOIN shipment sdt ON sdt.id = s.shipment_id) 
    ON s.product_id = i.product_id)  
INNER JOIN LastInvDateQ l 
    ON l.product_id = i.product_id AND idt.date = l.MaxInvDate  
WHERE sdt.date >= l.MaxInvDate  
GROUP BY i.product_id, i.quantity, idt.date 

Resupply Sum Abfrage(Summen Menge auf und nach oben ist MaxInvDate)

SELECT i.product_id, i.quantity AS inv_qty, idt.date AS inv_date, 
     SUM(r.quantity) AS resupply_qty  
FROM ((inventory_product i INNER JOIN inventory idt ON idt.id = i.inventory_id)  
INNER JOIN (resupplying r INNER JOIN resupply rdt ON rdt.id = r.resupply_id) 
    ON r.product_id = i.product_id)  
INNER JOIN LastInvDateQ l 
    ON l.product_id = i.product_id AND idt.date = l.MaxInvDate  
WHERE rdt.date >= l.MaxInvDate  
GROUP BY i.product_id, i.quantity, idt.date 

letzte Abfrage

SELECT s.product_id, s.inv_date, s.inv_qty, s.shipment_qty, r.resupply_qty, 
     (s.inv_qty - s.shipment_qty + r.resupply_qty) as estimated_qty 
FROM ShipQtyAggQ s 
INNER JOIN ResupplyQtyAggQ r ON (s.inv_date = r.inv_date) 
AND (s.inv_qty = r.inv_qty) 
AND (s.product_id = r.product_id); 

Natürlich können Sie nisten jede SELECT Anweisung als abgeleitete Tabellen in letzter Abfrage aber können schwierig werden, zu lesen und/oder pflegen.

+0

Ich schulde dir ein Bier. Off topic, aber die verknüpften Links Ihres Profils 404s. – Stephane

+0

Haha ... froh, dass ich helfen konnte! Seltsam, meine Profillinks funktionieren an meinem Ende. Vielleicht ein regionaler/Netzwerkzugriff für Sie? – Parfait

+0

Auch wenn ich eingeloggt bin, hier ist, was LinkedIn zu sagen hat: "Profil nicht gefunden Das LinkedIn-Profil, das Sie suchen, ist nicht öffentlich oder existiert nicht." Hoher Chaparral ... – Stephane

Verwandte Themen