台灣最大程式設計社群網站
線上人數
1156
 
會員總數:246713
討論主題:190131
歡迎您免費加入會員
討論區列表 >> MySQL >> MySQL 欄位累加遇到重複值會亂跳?!
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
MySQL 欄位累加遇到重複值會亂跳?!
價值 : 10 QP  點閱數:1831 回應數:7
樓主

elsa
門外漢
0 1
39 3
發送站內信

各位版上的前輩們好,
這兩天正在測試欄位累加的部分,
但是遇到有重複的值就會亂跳 Orz

TABLE`test01` 欄位如下:
+----+------+-------+
| ID | item | quota |
+----+------+-------+
| 1 | A | 1 |
| 2 | B | 3 |
| 3 | C | 10 |
| 4 | D | 10 |
| 5 | E | 20 |
+----+------+-------+

Google了語法後,用以下SQL去跑結果:


我期望跑出的結果是
+----+------+-------+-----+
| ID | item | quota | SUM |
+----+------+-------+-----+
| 1 | A | 1 | 1 |
| 2 | B | 3 | 4 |
| 3 | C | 10 | 14 |
| 4 | D | 10 | 24 |
| 5 | E | 20 | 44 |
+----+------+-------+-----+

但實際上跑出的結果卻是:
+----+------+-------+-----+
| ID | item | quota | SUM |
+----+------+-------+-----+
| 1 | A | 1 | 1 |
| 2 | B | 3 | 4 |
| 3 | C | 10 | 24 |
| 4 | D | 10 | 24 |
| 5 | E | 20 | 44 |
+----+------+-------+-----+

如果 quota 欄位的值沒有重複的情況,累加的結果是正確的。

想請教各位前輩們我的語法應該修正為何,在欄位有可能重複的情況下才能跑出正確的值呢?

搜尋相關Tags的文章: [ MySQL ] , [ 累加 ] , [ 累計相加 ] , [ 累計加總 ] , [ 運算 ] ,
本篇文章發表於2015-09-24 15:16
1樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
先抓一個錯誤出來...你用兩個以上的table要設定關聯
看是要a inner join b on ...
還是直接在 where 裡面下 a.id = b.id
本篇文章回覆於2015-09-24 15:54
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
不錯的參考

迷路
捐贈 VP 給 迷路 檢舉此回應
因為樓主的期望和SQL的條件不符合
樓主的條件式a.quota >= b.quota
ID 3和4 的quota都是10,它們SUM出來的值沒理由會不同
本篇文章回覆於2015-09-24 16:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

elsa
檢舉此回應
我把SQL改成

就跑出正確結果了,
不過SQL乍看之下感覺好像還是哪裡怪怪的...(?)
本篇文章回覆於2015-09-24 17:40
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

Daimom
捐贈 VP 給 Daimom 檢舉此回應
歹事,沒注意到是要算累加值。
用a.id 也是可以 不過如果id亂跳的話就....
最好的方法是直接做row_number..mysql好像沒這個函數 需要另外寫。
本篇文章回覆於2015-09-25 09:27
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

elsa
檢舉此回應
我的 id 其實是 primary key 並且採用 auto_increment 的方式,應該不會有重複值發生。
請問這樣是否就可以直接用 id 呢??
還是其實做 row_number 之類的會比較好呢??
本篇文章回覆於2015-09-25 12:04
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
最有價值解答

Daimom
捐贈 VP 給 Daimom 檢舉此回應
後來想想應該是沒有問題,我想多了。
不過要注意的應該是item,如果他也是一個連續的值 A、B、C、D、E 要按照此順序加總的話,就需要另外做row_number了。

當資料 變成 (1,'A',50),(2,'B',30),(6,'C',40),(4,'D',40),(5,'E',50),(7,'C',30)
而你又以id排序的話 出來的結果是

1 A 50 50
2 B 30 80
4 D 40 120
5 E 50 170
6 C 40 210
7 C 30 240

但用 item排序的話 則是 變成

1 A 50 50
2 B 30 80
6 C 40 210
7 C 30 240
4 D 40 120
5 E 50 170

如果沒這層顧慮的話,就放心用吧。
本篇文章回覆於2015-09-25 13:04
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

elsa
檢舉此回應
哦哦,受教了!!
非常感謝您!!

也感謝2樓的迷路前輩提點關鍵。
本篇文章回覆於2015-09-25 14:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.