[英]Mysql : JOIN 2 table , one of the SUM is not correct
這是兩個表的結構
表A
+----+-----+----+----------------------+--------------------+----------+
| id | ... |....| time_start | time_end | total |
+----+-----+----+----------------------+--------------------+----------+
1 2015-12-06 10:00:00 2015-12-06 12:00:00 200
2 2015-12-07 10:00:00 2015-12-07 12:00:00 300
表B
+----+----------+------+------+------+------+
| id | idTableA | val1 | val2 | val3 | val4 |
+----+----------+------+------+------+------+
1 1 10 10 10 10
2 1 10 10 10 10
3 2 10 10 10 10
目標如下:給定一個time_start和一個time_end date,顯示總計的總和(表A)和val1,val2,val3,val4的總和
范例 :
time_start = 2015-12-01 00:00:00
time_end = 2015-12-30 23:59:59
預期結果 :總計= 500,val(1-4)等於120
我已經嘗試過了:
$myquery = "";
$myquery .= "SELECT SUM(tableA.total) AS myTotal,";
$myquery .= "SUM(tableB.val1) + SUM(tableB.val2) + SUM(tableB.val3) + SUM(tableB.val4) AS myValTotal ";
$myquery .= "FROM tableA INNER JOIN tableB ON tableA.id = tableB.idTableA ";
$myquery .= "WHERE tableA.time_start >='".$dateStart."' AND tableA.time_end <='".$dateEnd."'";
val(1-4)的SUM正確,但合計的SUM不正確。
您必須檢查想要重疊的數據范圍是部分還是全部。
最好的測試方法是首先直接在數據庫上復制查詢。
在WHERE
檢查數據范圍
SET @dateStart= '2015-12-01 00:00:00';
SET @dateEnd = '2015-12-30 23:59:59';
SELECT myTotal, myValTotal
FROM
(
SELECT SUM(tableA.total) AS myTotal
FROM tableA
WHERE tableA.time_start >= @dateStart
AND tableA.time_end <= @dateEnd ;
) T1
CROSS JOIN
(
SELECT SUM(tableB.val1 + tableB.val2 + tableB.val3 + tableB.val4) AS myValTotal
FROM tableA
INNER JOIN tableB
ON tableA.id = tableB.idTableA
WHERE tableA.time_start >= @dateStart
AND tableA.time_end <= @dateEnd
) T2;
您不應該在行的乘法上進行匯總。 而是獨立地聚合兩個表,然后將它們聯接起來,例如:
select * from
(
SELECT SUM(tableA.total) AS myTotal
FROM tableA
WHERE tableA.time_start <= @dateEnd
AND tableA.time_end >= @dateStart
) x join (
SELECT SUM(tableB.val1) + SUM(tableB.val2) +
SUM(tableB.val3) + SUM(tableB.val4) AS myValTotal
FROM tableB join tableA ON tableA.id = tableB.idTableA
WHERE tableA.time_start <= @dateEnd
AND tableA.time_end >= @dateStart
) y;
作為起點,這似乎更容易閱讀...
$myquery =
"
SELECT SUM(a.total) myTotal
, SUM(b.val1 + b.val2 + b.val3 + b.val4) myValTotal
FROM tableA a
JOIN tableB b
ON b.idTableA = a.id
WHERE a.time_start >='$dateStart'
AND a.time_end <='$dateEnd'
";
SELECT
SUM(tableB.val1) + SUM(tableB.val2) + SUM(tableB.val3) + SUM(tableB.val4) AS myValTotal,
(SELECT SUM(total) from tableA where tableA.time_start >='2015-12-01 00:00:00' AND tableA.time_end <= '2015-12-30 23:59:59') as myTotal
FROM tableA INNER JOIN tableB ON tableA.id = tableB.idTableA
WHERE tableA.time_start >='2015-12-01 00:00:00' AND tableA.time_end <= '2015-12-30 23:59:59'
在加入數據之前先匯總數據,這樣您就不會誤認為值是多重的。
select sum(a.total) as mytotal, sum(b.sumval) as myvaltotal
from tablea a
left join
(
select idtablea, sum(val1+val2+val3+val4) as sumval
from tableb
group by idtablea
) b on b.idtablea = a.id
where a.time_start >= @start and a.time_end <= @end;
這與SELECT子句中的子查詢相同。 它更簡單,可以繞開Juan Carlos Oropeza在以下評論中描述的問題。
select
sum(total) as mytotal,
sum((
select sum(val1+val2+val3+val4)
from tableb
where idtablea = tablea.id
)) as sumvaltotal
from tablea
where time_start >= @start and time_end <= @end;
您可以聲明int類型的變量並存儲總和值,然后再次對存儲的值求和以獲得總值
declare @val1 int
declare @val2 int
declare @val3 int
declare @val4 int
declare @newval int
select @val1= SUM(isnull(val1,0)) , @val2 =
sum(isnull(val2,0)), @val3=sum(isnull(val3,0)),@val4 =
sum(isnull(val2,0)) from TableB
select @newval = @val1 +@val2+@val3+@val4
@newval將包括val1與val4之和
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.