如何在与mysql相同的查询中使用SUM和COUNT并获得准确的结果

时间:2010-11-06 20:35:03

标签: sql mysql join aggregate-functions

我有一对多的关系。更具体地说,t1是订单信息,t2是这些订单的行项目详细信息。

我正在尝试使用这样的查询:

   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的正确值。但是其他值不正确地膨胀。据我所知,使用左连接我会添加额外的行,这就是总和不正确的原因。我只是不确定如何解决它。

非常感谢任何帮助。

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

日期|订单计数| 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

1 个答案:

答案 0 :(得分:4)

我使用子查询首先对子表的值进行求和,如

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

没有保证这个代码实际上有效,我的SQL有点生疏......但我希望你有这个主意。

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

IF - 构造在您的代码中放错位置:要么使用类似SUM(IF(op.record_type='cpn',op.price,0))的内容,要么更好的是,在内部查询中放置WHERE子句,仅选择带{{的OP 1}},即make it

record_type='cpn'