iT邦幫忙

0

有關MYSQL SUM 關聯資料庫時 重複加總

  • 分享至 

  • xImage

https://ithelp.ithome.com.tw/upload/images/20190314/20030235HL83xQNcs8.jpg
因為發票明細內有三筆資料,結果 收費明細.收費金額 被重複累加三次。
請問各位大大,我哪邊寫錯了???
謝謝 :)

石頭 iT邦高手 1 級 ‧ 2019-03-14 23:41:56 檢舉
請提供測試資料和期望結果 不然我不知道問題怎麼發生的
另外我建議不要使用中文來當欄位名 最好使用英文
我猜是 left join 使你的一筆資料變成多筆,先把 sum 跟 group by 拿掉確認你原始資料為何吧!
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
thwu
iT邦新手 4 級 ‧ 2019-03-15 10:02:50
最佳解答
SELECT
	[收費資料].[會員編號], [收費資料].[收費編號], SUM([收費明細].[收費金額])
FROM
	[會員名冊]
	LEFT JOIN [收費資料] ON [會員名冊].[會員編號] = [收費資料].[會員編號]
	LEFT JOIN [收費明細] ON [收費資料].[收費編號] = [收費明細].[收費編號]
	LEFT JOIN [發票資料] ON [收費明細].[收費編號] = [發票資料].[收費編號]
	LEFT JOIN [發票明細] ON [發票資料].[發票號碼] = [發票明細].[發票號碼]

在我打完上面的 SQL 後,以下是我的推測:
如果 [收費資料] 是訂單,那 [收費明細] 就是訂單中的品項。
而 [發票資料] 是發票,那 [發票明細] 就是發票中的品項。
如果 [收費資料] 與 [發票資料] 是 1 對 1,那 [收費明細] 應該與 [發票明細] 是 1 對 1。
但你缺少了 [收費明細] 與 [發票明細] 的關聯,所以就產生笛卡兒乘積,出現重覆資料列的狀況。

補上關聯應該就好了

LEFT JOIN [發票明細] ON 
    [發票資料].[發票號碼] = [發票明細].[發票號碼]
    AND [收費明細].[收費明細編號] = [發票明細].[收費明細編號]
ltc09 iT邦研究生 4 級 ‧ 2019-03-20 08:29:26 檢舉

感謝 thwu 大大
應該是產生笛卡兒乘積
最後修正為
LEFT JOIN 發票明細 ON 發票資料.發票號碼=發票明細.發票號碼 AND 收費資料.收費編號=發票資料.收費編號

因為
收費明細 與 發票明細 非1對1

ltc09 iT邦研究生 4 級 ‧ 2019-04-14 17:03:13 檢舉

還是失敗了,最後還是分兩次運算 :(

0
純真的人
iT邦大師 1 級 ‧ 2019-03-15 00:11:13

你把group by 拿掉~
直接看重複明細~就知道那裡重複了~
有必要的話~直接用 * 字號~看全部資料

0
rogeryao
iT邦超人 7 級 ‧ 2019-03-15 09:20:18
"WHERE " & 條件排序
改為
"WHERE 1=1 " & GROUP BY 收費資料.會員編號 , 收費資料.收費編號 & 條件排序
試試
ltc09 iT邦研究生 4 級 ‧ 2019-03-20 10:16:36 檢舉

感謝您 :)

0
做工仔人!
iT邦大師 1 級 ‧ 2019-03-15 10:15:18

最後二個 LEFT JOIN 停止, 應該就好了 !

1.發票資料在 SELECT 的欄位中並沒有用到. 那就不用JOIN
2.主要問題: 收費明細的 JOIN 來源是 收費資料 , 發票資料的 JOIN 來源也是收費資料, 發票明細的JOIN 來源是票資料. 如果收費明細有3筆資料, 發票明細正常來說也是3筆資料.
收費資料 JOIN 收費明細 : 就會得到3筆資料.
收費資料 JOIN 發票資料 : 得到1筆資料
發票資料 JOIN 發票明細 : 又得3 筆資料.
因為資料在同一個 SELECT 中, 所以就會 3 X 3 = 9 筆資料.(金額就會是3倍)

停掉發票資料與發票明細 的 JOIN :就可以得到正確的金額.

若要用到發票明細中的資料,建議:
用收費明細與發票明細來做 JOIN (因為這二個TABLE 的資料應該要1對1)

ltc09 iT邦研究生 4 級 ‧ 2019-03-20 08:30:44 檢舉

感謝您 :)

0

join的用法並不太對。
依你目前的用法。等於是「會員」去對應「收費」
「收費」再去對應「明細」
然後後額外的去對應「發票」跟「發票明細」

這對sql來說,等於你的收費對應資料會有4筆重覆資料。
再全部統合到會員上。就會產生多倍的數值出現。

做工仔人!他有更明確的說明。我就不再詳細說明。

只能說,你目前的做法百分一千一定死。一定是要語法重新改掉
如需要有人幫你。還請提供對應的資料表欄位及名稱後。
再將想要的結果一起列出來。這樣才能幫你。

ltc09 iT邦研究生 4 級 ‧ 2019-03-20 08:32:05 檢舉

感謝您 :)

我要發表回答

立即登入回答