2016-06-16 7 views
0

Hallo Leute ich habe eine harte Zeit, wie man die Summe eines bestimmten Datums in TotalSold Spalte. Ich habe hier PartNumber, TotalOrder, TotalSold und POUnitCost. Wie kann ich das Datum von TotalSold filtern, da sich das Datum in einer anderen Tabelle namens SO_SalesOrder befindet. Vielen Dank!MS SQL bekommen die Summe des angegebenen Datums

MyQuery:

select PartNumber = (select name from base_product as PROD where prod.prodid = POL.prodid), 
     TotalOrder = sum(POL.quantity), 
     TotalSold = (select sum(SOL.quantity) from so_salesorder_line as SOL where SOL.ProdId = POL.prodid), 
     PoUnitCost = max(POL.UnitPrice)      
from PO_Purchaseorder_line as POL 
where POL.purchaseorderid in (
    select purchaseorderid 
    from PO_purchaseorder as PO 
    where orderdate >= '5/1/2015') 
group by POL.prodid 
+2

Welche RDBMS verwenden Sie? Sieht aus wie MySQL. – gofr1

+1

Und die Frage ist? –

+0

hi sein MsSQL Maestro, ich möchte auch das Datum von TotalSold – Christine

Antwort

1

Registriert so_salesorder_line mit so_salesorder so in der Lage sein, den Zeitpunkt zuzugreifen.

Verwenden Sie übrigens ISO-Datumsliterale anstelle von mehrdeutigen Datumszeichenfolgen. ('5/1/2015' könnte den 1. Mai oder 5. Januar bedeuten, abhängig von der aktuellen Einstellung in Ihrem DBMS.)

Hier ist der Teil, der den TotalSold erhalten soll (für den 1. Mai - ändern Sie diesen zu '20150105') wenn Sie den 5. Januar stattdessen wünschen.)

TotalSold = 
(
    select sum(SOL.quantity) 
    from so_salesorder_line as SOL 
    join so_salesorder SO on SO.salesorderid = SOL.salesorderid 
    where SOL.ProdId = POL.prodid 
    and SO.orderdate >= '20150501' 
), 
+0

Ich bin froh, dass es tut :-) Allerdings sehen Sie meinen letzten Kommentar zu Ihrer Anfrage; Die Abfrage sieht nicht korrekt aus. TotalSold bezieht sich auf ein Produkt, aber die POL.-Beschreibung bezieht sich auf eine Auftragsposition. Das scheint merkwürdig. Ihre Ergebniszeilen sollten * entweder * Produkte * oder * Auftragspositionen sein. –

+0

Hallo Sir, ich habe es schon gechickt. Danke an euch;) – Christine

+0

Hallo Sir ich habe gemerkt, dass es noch immer falsche Ergebnisse gibt, ich habe versucht es zu überarbeiten und ich denke ich habe die richtige Abfrage bekommen. :) – Christine

1

Ich denke, die Arbeit mit Verknüpfungen ist viel einfacher und klarer. Versuchen Sie diese:

select po.orderdate, POL.description, 
    prod.name as PartNumber 
    sum(POL.quantity) as TotalOrder, 
    sum(SOL.quantity) as TotalSold, 
    max(POL.UnitPrice) as PoUnitCost      
    from PO_Purchaseorder_line as POL 
    left join so_salesorder_line as SOL on SOL.ProdId = POL.prodid 
    left join PO_purchaseorder as PO on POL.purchaseorderid=PO.purchaseorderid 
    left join base_product as PROD on prod.prodid = POL.prodid 
    where po.orderdate >= '5/1/2015' 
    group by po.orderdate, POL.prodid,prod.name 
+0

Hallo Herr Danke. Ich möchte auch das Datum von TotalSold – Christine

+0

@ Djacks007 filtern: Arbeiten mit Joins ist an erster Stelle viel fehleranfälliger :-) Wenn Sie mit Aggregaten aus verschiedenen Tabellen arbeiten, dann verbinden Sie die Aggregate nicht die Tabellen. Bei einem Produkt mit mehreren Datensätzen in POL und SOL für ein Datum würden Sie Werte multiplizieren und falsche Ergebnisse erhalten. –

0

ich überarbeitete es und erhielt das korrekte Ergebnis.

SELECT DISTINCT 
BASE_Product.NAME, 
BASE_Product.DESCRIPTION, 

TotalOrders = (Select(Select sum(quantity) from PO_PurchaseOrder_Line as POL 
LEFT JOIN PO_PurchaseOrder PO ON POL.PurchaseOrderId = PO.PurchaseOrderId 
     where POL.ProdId = BASE_Product.ProdId AND orderdate >= '20140101')), 

PoPrice = (Select max(UnitPrice) from PO_PurchaseOrder_Line as POL where POL.ProdId = BASE_Product.ProdId), 

PoExRate = (Select ExchangeRate from PO_PurchaseOrder where PO_PurchaseOrder.PurchaseOrderId = POL.PurchaseOrderId) , 

UnitCost = (POL.UnitPrice) * (Select Round(ExchangeRate, 4) from PO_PurchaseOrder where PO_PurchaseOrder.PurchaseOrderId = POL.PurchaseOrderId) , 

TotalSold = (SELECT SUM(SOL.quantity) FROM so_salesorder_line AS SOL 
    LEFT JOIN so_salesorder SO ON SO.salesorderid = SOL.salesorderid 
    WHERE SOL.ProdId = BASE_Product.prodid AND SO.orderdate >= '20150101') 

FROM BASE_Product 

FULL JOIN PO_PurchaseOrder_Line as POL ON BASE_Product.ProdId = POL.ProdId