我有一对多的关系。更具体地说,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
答案 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'