2010-11-06 46 views
0

我有两个表中的一对多关系。更具体地说,t1是订单信息,t2是这些订单上的订单项详细信息。如何在使用mysql的同一查询中使用SUM和COUNT并获得准确的结果

我试图用这样的查询:

SELECT COUNT(DISTINCT(t1.id)) order_count, 
      SUM(t1.order_total) order_total, 
      SUM(t2.product_price) product_total, 
      DATE(t1.order_date) order_date 
    FROM t1 
LEFT JOIN t2 ON t1.id = t2.id 
GROUP BY t1.order_date 

该查询返回ORDER_COUNT正确的值。但其他值不正确地膨胀。据我所知,用左连接我添加额外的行,这就是为什么总和是不正确的。我只是不知道如何解决它。

任何帮助将不胜感激。

编辑:输出应该是这样的:

DATE |订单计数| GRAND TOTAL

我根据响应开发了以下查询。除了每次返回0的coupon_total之外,它会正确返回所有值。

SELECT 
COUNT(DISTINCT(o.order_number)) order_count, 
DATE(o.order_date) order_date, 
SUM(o.total_product_total) product_total, 
SUM(o.total_shipping) shipping_total, 
SUM(o.total_grand_total) grand_total, 
o.coupon_total 
FROM (
SELECT 
DATE(o.order_date) order_date, 
o.order_number, 
o.total_product_total, 
o.total_shipping, 
o.total_grand_total, 
IF(op.record_type='cpn',SUM(op.price),0) coupon_total 
FROM orders o 
LEFT JOIN orders_products op ON o.order_number=op.order_number 
GROUP BY o.order_number 
) o 
GROUP BY DATE(o.order_date) 
ORDER BY o.order_date DESC 
+0

的样本数据可能有助于 – 2010-11-06 20:44:26

+0

你为什么要按照日期分组,但不选择它?目前还不清楚你想要这个查询返回什么! – 2010-11-06 21:31:04

回答

2

我会使用一个子查询第一求和子表的值一样

SELECT t1.id, t1.order_total, SUM(t2.product_price) product_total 
FROM t1 LEFT JOIN t2 on t1.id=t2.id 
GROUP BY t1.id, t1.order_total 

该查询返回所有单笔订单与他们总结出的产品价格。

的使外部查询求和order_total并返回像

SELECT COUNT(DISTINCT(t1.id)) order_count, 
     SUM(t1.order_total) order_total, 
     SUM(t2.product_price) product_total 
FROM (
    SELECT t1.order_date, t1.id, t1.order_total, SUM(t2.product_price) product_total 
    FROM t1 LEFT JOIN t2 on t1.id=t2.id 
    GROUP BY t1.order_date, t1.id, t1.order_total 
) GROUP BY t1.order_date 

计数没有garantuee此代码实际工作,我的SQL是一个有点生疏...但我希望你有这个想法。

编辑(响应您的编辑...)

IF -construct在代码中放错了地方:无论你使用类似SUM(IF(op.record_type='cpn',op.price,0)),或者甚至更好,放置一个WHERE条款在你的内心查询与record_type='cpn'只选择有机磷农药,即让它

.... 
SUM(op.price) coupon_total 
FROM orders o 
LEFT JOIN orders_products op ON o.order_number=op.order_number 
WHERE op.record_type='cpn'` 
GROUP BY o.order_number 
.... 
+0

我可能能够实现这一点,但我很犹豫使用它,因为我不明白它是如何工作的,它究竟在做什么,以及在将来如何改变/修复它。 – JungAtHeart 2010-11-06 21:43:12

+0

将第一个(子)查询看作是包含所有订单及其各自产品总计(即仅在't2'上求和)的中间表。第二个(外部)查询然后使用它并计算剩余的总和/计数。由于子查询中每个订单只有一行,所以'order_total'之和应该正确完成。 – MartinStettner 2010-11-06 21:54:12

+0

我已经实现了一个类似于你的查询。结果几乎准确。在我原来的问题编辑解释更多。 – JungAtHeart 2010-11-06 23:30:59

相关问题