iT邦幫忙

0

[MySQL,變數,group,加總]select透過變數乘積與直接乘積的值為什麼會不同

舜~ 2019-03-21 16:15:281480 瀏覽

各位大大您好,小弟遇到一個奇怪的問題,透過變數乘積與直接乘積的值竟然會不同,但不知道原因,想問問各位大大有人能跟小弟說明一下嗎?

先上SQL,並透過group_concat列出原始資料

select 
  @lessonCnt:=perweekno*weeksno `乘積1`
  ,perweekno*weeksno `乘積2`
  ,sum(@lessonCnt) `加總乘積1`
  ,sum(perweekno*weeksno) `加總乘積2`
  ,group_concat(perweekno) `原始資料1`
  ,group_concat(weeksno) `原始資料2`
from wtplan
group by schcode,semester

查詢結果

乘積1 乘積2 加總乘積1 加總乘積2 原始資料1 原始資料2
21 21 147 86 3,2,2,2,3,2,2 7,4,4,4,7,5,5
21 21 147 96 3,2,2,2,3,3,3 7,4,4,4,7,5,5
8 8 8 8 2 4
21 21 147 123 3,3,3,3,3,3,3 7,7,7,5,5,5,5
21 21 147 123 3,3,3,3,3,3,3 7,7,7,5,5,5,5
21 21 189 166 3,3,3,3,3,3,2,2,3 7,7,7,7,7,4,7,7,7
21 21 189 166 3,3,3,3,3,3,3,2,2 7,7,7,7,7,7,4,7,7
28 28 56 42 4,2 7,7

問題
以第一筆資料為例,(3x7 + 2x4 + 2x4 + 2x4 + 3x7 + 2x5 + 2x5) = 86
加總乘積2 是正確的,但不知道為什麼 加總乘積1 的資料會異常?

2 個回答

6
一級屠豬士
iT邦高手 1 級 ‧ 2019-03-21 21:38:15
最佳解答

MySQL 的@var 引用的方式,不是如同你想像那樣.故跑出非你預期的結果.
以你的

select @lessonCnt:=perweekno*weeksno
     ,sum(@lessonCnt)

來說,這是一起評估的,也就是說 @lessonCnt 在 sum()裡,會先抓目前的值(上次運算),
在同一次評估的@lessonCnt:=perweekno*weeksno 才更新.

而且執行的順序,也不一定是依照你最後看到的順序來聚合.可能是先做某種schcode,semester組合
所以最後的結果會是不預期的.

這種變數的使用,在ANSI SQL中並未定義.MySQL提供變數功能,但不適用在你這個案例.
就使用你的sum(perweekno*weeksno) 這樣的方式,才是通用且能計算出正確答案.

舜~ iT邦研究生 3 級 ‧ 2019-03-22 09:44:26 檢舉

感謝前輩解惑 :D

0
海綿寶寶
iT邦超人 1 級 ‧ 2019-03-21 16:39:05

加總乘積1=乘積1x原始資料筆數
147 = 21 x 7 以第一筆資料為例

ant1017 iT邦新手 4 級 ‧ 2019-03-21 16:48:17 檢舉

為什麼我會聯想到看圖猜數字=_=

小魚 iT邦高手 1 級 ‧ 2019-03-21 17:20:28 檢舉

應該是智力測驗吧...

我要發表回答

立即登入回答