2010-08-17 8 views
6

Ho due tabelle come seguecalcolando la somma di (Quantità * Prezzo) da 2 tabelle differenti

PRODUCT tavolo

Id | Name | Price 

e un tavolo ORDERITEM

Id | OrderId | ProductId | Quantity 

Quello che sto provare a fare è, calcolare il prezzo totale parziale per ciascun prodotto (Quantità * Prezzo), quindi SUM il valore TOTALE per l'intero ordine ..

sto cercando qualcosa di simile

SELECT Id, SUM(Quantity * (select Price from Product where Id = Id)) as qty 
FROM OrderItem o 
WHERE OrderId = @OrderId 

Ma, naturalmente, che non funziona :)

Qualsiasi aiuto apprezzato!

MODIFICA: Voglio solo mostrare il totale generale per l'intero ordine, quindi in pratica la somma di Quantità * Prezzo per ogni riga in OrderItem. Ecco alcuni dati di esempio.

dei dati di campionamento

TABELLA prodotto

Id  Name   Price 
1  Tomatoes  20.09  
4  Cucumbers  27.72  
5  Oranges   21.13  
6  Lemons   20.05 
7  Apples   12.05 

Tabella OrderItem

Id   OrderId  ProductId  Quantity 
151  883   1    22 
152  883   4    11 
153  883   5    8 
154  883   6    62 

M

012.351.641,061 mila
+0

Vuoi due colonne: subtotale per prodotto e totale per ordine? La tua query ha solo una colonna ... –

+2

È meglio quando chiedi consiglio sulle query SQL di includere una piccola quantità di dati di esempio (anche se solo 3 o 4 righe) e il risultato atteso dalla query. –

+0

Ciao Tom: ora hanno aggiunto dati di esempio. – Marko

risposta

17

Usa:

SELECT oi.orderid, 
     SUM(oi.quantity * p.price) AS grand_total, 
    FROM ORDERITEM oi 
    JOIN PRODUCT p ON p.id = oi.productid 
    WHERE oi.orderid = @OrderId 
GROUP BY oi.orderid 

presente che se uno o oi.quantityp.price è nullo, la somma sarà tornare NULL.

+0

+1 per correttezza e strappa la struttura di base. – Randy

+1

+1 Comunque penso che l'affermazione "se" oi.quantity' o 'p.price' è null allora SUM restituirà NULL" è un po 'poco chiaro. Sum restituirà null solo se il valore di tutte le righe di un gruppo è nullo. Altrimenti la somma ignora nullo. Quindi la quantità o il prezzo dovrebbero essere nulli per ogni riga di un gruppo per quel gruppo essere nullo. –

+0

Ehi @OMG Ponies, la tua query restituisce un subtotale per ogni riga OrderItem, piuttosto che il totale generale per tutte le righe .. Quasi come la SUM viene ignorata:/ – Marko

0
select orderID, sum(subtotal) as order_total from 
(
    select orderID, productID, price, qty, price * qty as subtotal 
    from product p inner join orderitem o on p.id = o.productID 
    where o.orderID = @orderID 
) t 
group by orderID 
+0

Ciao @Beth - Ottengo una "sintassi errata vicino alla parola chiave" GRUPPO "." – Marko

+0

scusate, era necessario aggiungere un alias dopo il) – Beth

+0

Questo restituisce ogni riga nella tabella OrderItem, e order_total e subtotal sono identici, quindi SUM di nuovo non sta facendo il suo lavoro:/ – Marko

1

Penso che questo - tra cui valore nullo = 0

SELECT oi.id, 
     SUM(nvl(oi.quantity,0) * nvl(p.price,0)) AS total_qty 
    FROM ORDERITEM oi 
    JOIN PRODUCT p ON p.id = oi.productid 
    WHERE oi.orderid = @OrderId 
GROUP BY oi.id 
+1

'NVL' è specifico per Oracle - COALESCE sarebbe una scelta migliore. –

+0

Non c'è alcun motivo per fare COALESCE (o NVL) su ciascun ingresso. Potresti: 'coalesce (somma (oi.quantity * p.price), 0) come total_qty'. –

+0

Questo non restituisce il totale complessivo, ma piuttosto il totale parziale per ogni riga OrderItem, uguale alla risposta di @OMG Ponies sopra .. – Marko

1

credo che questo sia lungo le linee di quello che stai cercando. Sembra che tu voglia vedere l'orderid, il subtotale per ogni articolo nell'ordine e l'importo totale per l'ordine.

select o1.orderID, o1.subtotal, sum(o2.UnitPrice * o2.Quantity) as order_total from 
(
    select o.orderID, o.price * o.qty as subtotal 
    from product p inner join orderitem o on p.ProductID= o.productID 
    where o.orderID = @OrderId 
)as o1 
inner join orderitem o2 on o1.OrderID = o2.OrderID 
group by o1.orderID, o1.subtotal 
+0

Ehi @mpminnich, ho solo bisogno del totale generale per tutti gli ordini, quindi sostanzialmente la SOMMA della quantità *Prezzo – Marko

0

ho avuto lo stesso problema di Marko e venire attraverso una soluzione di questo tipo:

/*Create a Table*/ 
CREATE TABLE tableGrandTotal 
(
columnGrandtotal int 
) 

/*Create a Stored Procedure*/ 
CREATE PROCEDURE GetGrandTotal 
AS 

/*Delete the 'tableGrandTotal' table for another usage of the stored procedure*/ 
DROP TABLE tableGrandTotal 

/*Create a new Table which will include just one column*/ 
CREATE TABLE tableGrandTotal 
(
columnGrandtotal int 
) 

/*Insert the query which returns subtotal for each orderitem row into tableGrandTotal*/ 
INSERT INTO tableGrandTotal 
    SELECT oi.Quantity * p.Price AS columnGrandTotal 
     FROM OrderItem oi 
     JOIN Product p ON oi.Id = p.Id 

/*And return the sum of columnGrandTotal from the newly created table*/  
SELECT SUM(columnGrandTotal) as [Grand Total] 
    FROM tableGrandTotal 

e semplicemente utilizzare il GetGrandTotal stored procedure per recuperare il totale complessivo :)

EXEC GetGrandTotal 
Problemi correlati