2010-11-06 63 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

相關問題