簡體   English   中英

來自兩個表和GROUP BY日期的SQL SELECT SUM

[英]SQL SELECT SUM from two tables and GROUP BY date

在MySQL 5.1數據庫中,我有兩個表( rescuescounts )具有一對多關系。 rescues可能有多個具有相同日期時間的行。 counts中,至少有一行(或更多)與rescues相關聯(rescues.id = counts.id_rescue)。

我想得到:

  • “救援”中的列總和
  • “計數”中某些列的總和
  • 一列的總和(以“ counts”為單位)
  • 按日期將結果分組

這就是我在做什么: http : //sqlfiddle.com/#!8/9a290/2/0

我得到以下結果(錯誤的sum_volounteers但正確的sum_alivesum_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_alivesum_deaddate_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM