2017-02-03 6 views
0

I 2 Tabellen verfolgt haben,Berechnung der Summe von (Menge * Preis) von 2 verschiedenen Tabellen

item_store

item_store table

Kauf

purchase table

Basierend auf br and_id und purchase_time Ich möchte die kumulierte Verkaufsmenge der verkauften Artikel berechnen. Im obigen Beispielszenario wurde der Posten "1" zweimal aus dem Geschäft "1" und einmal aus dem Geschäft "2" gekauft. Der Gesamtverkaufsbetrag sollte Gesamtmenge * Preis = (2 + 5) * 10 + 7 * 12 = 70 + 84 = 154 sein.

Ich finde es schwierig, 2 Tische so zu verbinden, dass der Preis genommen wird from item_store und Die kumulative Menge wird der Einkaufstabelle entnommen, um den Gesamtbetrag zu berechnen.

Diese zwei Tabellen müssen joined auf item_id und store_id zu basieren und wo Klausel brand_id und purchase_time aus Kauftabelle (zum Beispiel enthalten sollte - wo brand_id = 1 und purchase_time> = ‚2017.02.01 00.00: 00.000 ' und purchase_time < =' 2017-02-10 00: 00: 00.000 ').

Es wird immer eine Eins-zu-Eins-Zuordnung zwischen item_id und brand_id geben.

EDIT:

Wenn anstelle von Mengenspalten in Kauf Tabelle, wenn ich gerade Anzahl der Datensätze in Kauf Tabelle gefunden verwenden möge eine Idee, Gesamtverkaufsmenge zu berechnen, wie es zu erreichen. Was ich meine, ist, dass es keine Mengenspalte in der Einkaufstabelle gibt und stattdessen jeder einzelne Eintrag in der Einkaufstabelle eine verkaufte Artikelmenge darstellt. So etwas wie: Anzahl (*) der Datensätze in der Kauf-Tabelle * Preis in item_store

Vielen Dank.

Antwort

3

Ich denke, das ist, was Sie brauchen. Dies erfordert nur das Verbinden der Tabellen.

select sum(p.quantity*i.price) 
from purchase p 
join item_store i on p.item_id=i.item_id and p.store_id=i.store_id 
where p.brand_id = 1 
and p.purchase_time >= '2017-02-01 00:00:00.000' 
and p.purchase_time <= '2017-02-10 00:00:00.000' 

Edit: Basierend auf OP-Update

select count(*) over(partition by p.item_id,p.store_id) * i.price 
from purchase p 
join item_store i on p.item_id=i.item_id and p.store_id=i.store_id 
where p.brand_id = 1 
and p.purchase_time >= '2017-02-01 00:00:00.000' 
and p.purchase_time <= '2017-02-10 00:00:00.000' 
+0

Ja, Sie haben Recht. Die Abfrage funktioniert einwandfrei. Dank – ivish

+1

ist die Kaufzeit für die anderen beiden Datensätze außerhalb des angegebenen Datumsbereichs. –

+0

Ich habe es. Danke – ivish

1

Um Ihre erste Bit der Frage zu beantworten:

SELECT sum(p.quantity * itm.price) as total 
    FROM Item_Store itm 
    JOIN Purchase p ON p.store_Id = itm.store_id 

Um auf das zweite Stück der Frage zu bewegen, wo man über die reden Da Tabellen eine where-Bedingung verwenden müssen, die Ihre Ergebnisse ausschaltet, können Sie einfach eine verschachtelte SELECT-Anweisung verwenden. Dann spielt es keine Rolle, in welcher Bedingung Ihre Ergebnisse betroffen sind.

so könnten Sie haben:

original select-Anweisung - so etwas wie:

Select 

column1, column2, etc..., 

(SELECT sum(p.quantity * itm.price) as total 
    FROM Item_Store itm 
    JOIN Purchase p ON p.store_Id = itm.store_id) as TotalSales 

FROM item_store itm 
JOIN purchase p ON p.store_Id = itm.store_id 
Where brand_id = 1 
AND (purchase_time >= '2017-02-01 00:00:00.000' and purchase_time <= '2017-02-10 00:00:00.000') 

Sie es sogar kommen als in-line Ansicht tun konnte, was ich sagen kann, ist besser als es werde effektiver sein, in Bezug auf Leistung, dh

Select 

    column1, column2, TotalSales.total, etc... 

    FROM item_store itm 
    JOIN purchase p ON p.store_Id = itm.store_id 
    JOIN (SELECT sum(p.quantity * itm.price) as total 
      FROM Item_Store itm2 
      JOIN Purchase p2 ON p2.store_Id = itm2.store_id) as TotalSales 
    Where brand_id = 1 
    AND (purchase_time >= '2017-02-01 00:00:00.000' and purchase_time <= '2017-02-10 00:00:00.000') 

Sie werden die gleichen Ergebnisse, aber die Version beitreten sollte effizienter sein, da es nicht ist, die die sQL laufen für jede Zeile zurückgegeben.

Hoffe das macht Sinn!

Verwandte Themen