2013-06-27 58 views
2

以下查询当前显示的是总项目,但是我想要的是计算采购订单中所有项目的小计。查询中所有项目的小计

感谢

输出应该是:

POID Item ItemQTY ItemPrice ItemTotal SubTotal 
1  A  1  15.00  15.00  80.50 
1  B  1  25.50  25.50  80.50 
1  C  2  20.00  40.00  80.50 
2  X  6  5.00  30.00  50.00 
2  Y  2  10.00  20.00  50.00 

关系purchase_order 1 - N purchase_order_items

SELECT 
purchase_order.id AS POID, 

purchase_order_items.description AS Item, 
purchase_order_items.quantity AS ItemQTY, 
purchase_order_items.price AS ItemPrice, 
(purchase_order_items.quantity*purchase_order_items.price) AS ItemTotal 

/* Here, Subtotal should be calculated and displayed */ 

FROM purchase_order 
INNER JOIN purchase_order_items ON purchase_order.id = purchase_order_items.fk_purchase_order 

我看着MySQL finding subtotalsSubtotals and SQL,但不能适用于我的查询。

+0

你可以在你的服务器端脚本中用循环来计算这个值。或者,你可以在你的上面的查询中做一个内部的'SELECT'。 –

+0

作为一个单独的值,它会更好,因为小计在逻辑上对每行数据都没有意义。您应该调用一个单独的方法/ sql proc来获取总数,或者通过代码/其他方法计算返回的数据。 – Tanner

+0

@坦纳 - 这是可能的。请参阅下面的接受答案。 – BentCoder

回答

1

尝试

SELECT i.fk_purchase_order POID, 
     description   Item, 
     quantity   ItemQTY, 
     price    ItemPrice, 
     quantity * price ItemTotal, 
     s.subtotal   SubTotal 
    FROM purchase_order_items i JOIN 
(
    SELECT fk_purchase_order, SUM(quantity * price) subtotal 
    FROM purchase_order_items 
    GROUP BY fk_purchase_order 
) s ON i.fk_purchase_order = s.fk_purchase_order 

输出:

 
| POID | ITEM | ITEMQTY | ITEMPRICE | ITEMTOTAL | SUBTOTAL | 
------------------------------------------------------------ 
| 1 | A |  1 |  15 |  15 |  80.5 | 
| 1 | B |  1 |  25.5 |  25.5 |  80.5 | 
| 1 | C |  2 |  20 |  40 |  80.5 | 
| 2 | X |  6 |   5 |  30 |  50 | 
| 2 | Y |  2 |  10 |  20 |  50 | 

这里是SQLFiddle演示

+0

谢谢。有用。 – BentCoder

+0

不客气。我很高兴我可以帮助:) – peterm

0

怕我认为最好的办法是交叉连接对一个子查询: -

SELECT 
purchase_order.id AS POID, 
purchase_order_items.description AS Item, 
purchase_order_items.quantity AS ItemQTY, 
purchase_order_items.price AS ItemPrice, 
(purchase_order_items.quantity*purchase_order_items.price) AS ItemTotal, 
Sub1.FullTotal 
FROM purchase_order 
INNER JOIN purchase_order_items ON purchase_order.id = purchase_order_items.fk_purchase_order 
CROSS JOIN 
(
    SELECT SUM(purchase_order_items.quantity*purchase_order_items.price) AS FullTotal 
    FROM purchase_order 
    INNER JOIN purchase_order_items ON purchase_order.id = purchase_order_items.fk_purchase_order 
) Sub1 

要拿回来分组采购订单ID

SELECT 
purchase_order.id AS POID, 
purchase_order_items.description AS Item, 
purchase_order_items.quantity AS ItemQTY, 
purchase_order_items.price AS ItemPrice, 
(purchase_order_items.quantity*purchase_order_items.price) AS ItemTotal, 
Sub1.FullTotal 
FROM purchase_order 
INNER JOIN purchase_order_items ON purchase_order.id = purchase_order_items.fk_purchase_order 
INNER JOIN 
(
    SELECT purchase_order.id, SUM(purchase_order_items.quantity*purchase_order_items.price GROUP BY purchase_order.id) AS FullTotal 
    FROM purchase_order 
    INNER JOIN purchase_order_items ON purchase_order.id = purchase_order_items.fk_purchase_order 
) Sub1 
ON purchase_order.id = Sub1.id 
+0

由于我的错误,您的查询返回所有采购订单的小计。我的意思是,所有采购订单都是单独的。我更新了这个问题。 – BentCoder

+0

修改后的响应以匹配更新的要求。 – Kickstart

2

可以使用WITH ROLLUP功能来获取小计:

SELECT 
purchase_order.id AS POID, 

purchase_order_items.description AS Item, 
purchase_order_items.quantity AS ItemQTY, 
purchase_order_items.price AS ItemPrice, 
SUM(purchase_order_items.quantity*purchase_order_items.price) AS ItemTotal 
FROM purchase_order 
INNER JOIN purchase_order_items ON purchase_order.id = purchase_order_items.fk_purchase_order 
GROUP BY POID, Item WITH ROLLUP 

这将创建一个具有Item = NULL为宝分类汇总的结果集,并POID = NULL为盛大总。这些小计和总计位于这些行的ItemTotal列中。

+0

非常有趣。我会记住的。 +1 – BentCoder

+0

有趣。 +1 – Kickstart

相关问题