2010-08-17 8 views
6

Tengo dos tablas de la siguiente maneracalculando la suma de (Cantidad * Precio) de 2 tablas diferentes

PRODUCT mesa

Id | Name | Price 

y una mesa ORDERITEM

Id | OrderId | ProductId | Quantity 

Lo que estoy intentar hacer es, calcular el precio subtotal para cada producto (Cantidad * Precio) luego SUMAR el valor TOTAL para el pedido completo.

estoy intentando algo como esto

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

Pero por supuesto que no funciona :)

Cualquier ayuda apreciada!

EDIT: Solo quiero mostrar el total general de todo el pedido, así que básicamente la cantidad de Cantidad * Precio por cada fila en el artículo de pedido. Aquí hay algunos datos de muestra.

datos de muestra

tabla de productos

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

Tabla de pedido

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

M

+0

¿Desea dos columnas, subtotal por producto y total por pedido? Su consulta solo tiene una columna ... –

+2

Lo mejor es solicitar asesoramiento sobre consultas SQL para incluir una pequeña cantidad de datos de muestra (incluso si solo son 3 o 4 filas) y el resultado esperado de la consulta. –

+0

Hola Tom: ahora hemos agregado datos de muestra. – Marko

Respuesta

17

Uso:

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 

cuenta que si bien oi.quantity o p.price es nulo, el SUM devolverá NULL.

+0

+1 por corrección - y estafando su estructura básica. – Randy

+1

+1 Sin embargo, creo que la afirmación "si o bien' oi.quantity' o 'p.price' es nulo, entonces SUM devolverá NULL" es un poco incierto. Suma solo devolverá nulo si el valor para _todas_ filas de un grupo es nulo. De lo contrario, sum ignora nulo. Por lo tanto, la cantidad o el precio tendrían que ser nulos para cada fila de un grupo para que ese grupo sea nulo. –

+0

Oye @OMG Ponies, tu consulta arroja un subtotal para cada fila OrderItem, en lugar del total general para todas las filas. Casi como si se ignorara SUM:/ – 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

Hola @Beth: obtengo una "sintaxis incorrecta cerca de la palabra clave 'GRUPO'". – Marko

+0

lo siento, es necesario agregar un alias después de) – Beth

+0

Esto devuelve cada fila en la tabla OrderItem, y order_total y subtotal son idénticos, por lo que SUM otra vez no está haciendo su trabajo:/ – Marko

1

Creo que esto - incluyendo valor nulo = 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' es específico de Oracle - COALESCE sería una mejor opción. –

+0

No hay ninguna razón para hacer COALESCE (o NVL) en cada entrada. Usted podría: 'fusionar (suma (oi.quantity * p.price), 0) como total_qty'. –

+0

Esto no devuelve el Gran Total, sino más bien el subtotal de cada fila de Artículo de Órdenes, igual que la respuesta de los Ponis de @OMG anterior. – Marko

1

creo que esto es a lo largo de las líneas de lo que estés buscando. Parece que desea ver el orderid, el subtotal de cada artículo en el pedido y el monto total del pedido.

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

Hola @mpminnich, solo necesito el total general para todos los artículos de pedido, básicamente la SUMA de Cantidad *Precio – Marko

0

que tenían el mismo problema que Marko y vienen a través de una solución como esta:

/*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 

y simplemente usar el Procedimiento GetGrandTotal almacenado para recuperar el total general :)

EXEC GetGrandTotal 
Cuestiones relacionadas