各位大大您好,小弟遇到一個奇怪的問題,透過變數乘積與直接乘積的值竟然會不同,但不知道原因,想問問各位大大有人能跟小弟說明一下嗎?
先上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 的資料會異常?
MySQL 的@var 引用的方式,不是如同你想像那樣.故跑出非你預期的結果.
以你的
select @lessonCnt:=perweekno*weeksno
,sum(@lessonCnt)
來說,這是一起評估的,也就是說 @lessonCnt 在 sum()裡,會先抓目前的值(上次運算),
在同一次評估的@lessonCnt:=perweekno*weeksno 才更新.
而且執行的順序,也不一定是依照你最後看到的順序來聚合.可能是先做某種schcode,semester組合
所以最後的結果會是不預期的.
這種變數的使用,在ANSI SQL中並未定義.MySQL提供變數功能,但不適用在你這個案例.
就使用你的sum(perweekno*weeksno) 這樣的方式,才是通用且能計算出正確答案.
加總乘積1=乘積1x原始資料筆數
147 = 21 x 7 以第一筆資料為例