[英]How to write the sql to select the sum from three tables and group by date
[英]SQL SELECT SUM from two tables and GROUP BY date
在MySQL 5.1數據庫中,我有兩個表( rescues
和counts
)具有一對多關系。 rescues
可能有多個具有相同日期時間的行。 在counts
中,至少有一行(或更多)與rescues
相關聯(rescues.id = counts.id_rescue)。
我想得到:
這就是我在做什么: http : //sqlfiddle.com/#!8/9a290/2/0
我得到以下結果(錯誤的sum_volounteers
但正確的sum_alive
和sum_dead
):
date sum_volounteers sum_alive sum_dead
2014-02-02 5 138 18
2014-02-04 4 53 15
我期望的是:
date sum_volounteers sum_alive sum_dead
2014-02-02 11 138 18
2014-02-04 5 53 15
我相信您只需要對外部查詢的SUM()
志願者:
SELECT
r.date,
sum(r.sum_volounteers) AS sum_Volunteers,
sum(c.males + c.females + c.uncertains + c.couples*2) AS sum_alive,
sum(c.roadkills) AS sum_dead
FROM counts AS c
JOIN(
SELECT
r2.id AS selected_id,
sum(r2.volounteers) AS sum_volounteers,
CAST(r2.start AS DATE) AS date
FROM rescues AS r2
GROUP BY selected_id
) AS r ON c.id_rescue = r.selected_id
WHERE r.date >= '2014-02-02' AND r.date <= '2014-02-04'
GROUP BY r.date
演示: SQL Fiddle
由於您只是按日期分組,因此MySQL只是從子查詢中選擇一個sum_volunteers
值返回,而該日期有多個。
編輯:我發現使用此查詢的問題,如果有兩個或多個行rescues
與列相同數量的rescues.volounteers
的結果是錯誤的。 請參閱我的其他答案以獲取正確的解決方案。
感謝其他評論,我發現我需要對外部查詢
SUM(DISTINCT r.volounteers)
:
http :
SUM(DISTINCT r.volounteers)
/0
不需要在子查詢中使用
SUM()
。
SELECT r.date, sum(DISTINCT r.volounteers) AS sum_volounteers, sum(c.males + c.females + c.uncertains + c.couples*2) AS sum_alive, sum(c.roadkills) AS sum_dead FROM counts AS c JOIN( SELECT r2.id AS selected_id, r2.volounteers AS volounteers, CAST(r2.start AS DATE) AS date FROM rescues AS r2 GROUP BY selected_id ) AS r ON c.id_rescue = r.selected_id WHERE r.date >= '2014-02-02' AND r.date <= '2014-02-04' GROUP BY r.date
現在我得到正確的結果:
date sum_volounteers sum_alive sum_dead 2014-02-02 11 138 18 2014-02-04 5 53 15
解決方案是在外部查詢中選擇SUM(r.volounteers) AS sum_volounteers
,然后在子查詢中獲取sum_alive
, sum_dead
和date_of_sums
(在子查詢中使用JOIN
)和GROUP BY date_of_sums
然后JOIN c.date_of_sums = CAST(r.start AS DATE)
我張貼的其他查詢失敗時記錄中加入rescues
與列相同數量的rescues.volounteers
,這是正確的:
SELECT
r.id,
CAST(r.start AS DATE) AS date,
SUM(r.volounteers) AS sum_volounteers,
sum_alive,
sum_dead
FROM rescues AS r
JOIN(
SELECT
CAST(r2.start AS DATE) AS date_of_sums,
sum(c2.males+c2.females+c2.uncertains+c2.couples*2) AS sum_alive,
sum(roadkills) AS sum_dead
FROM counts AS c2
JOIN rescues as r2
ON r2.id = c2.id_rescue
GROUP BY date_of_sums
) AS c
ON c.date_of_sums = CAST(r.start AS DATE)
WHERE
CAST(r.start AS DATE) >= '2014-02-02'
AND CAST(r.start AS DATE) <= '2014-02-04'
GROUP BY CAST(r.start AS DATE)
這是一個演示:
此查詢給出正確的結果:
date sum_volounteers sum_alive sum_dead
2014-02-02 11 138 18
2014-02-04 9 73 23
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.