iT邦幫忙

0

資料庫的數值 sum加總後,數值仍然會少算?!

  • 分享至 

  • xImage

我已重覆驗證多次,還是找不太出bug是什麼,想請問有經驗的各位

到底是為什麼會在加總後,數值仍舊會少 1 ?!

謝謝

數值驗證正確結果

圖片1

SQL計算卻少算了1

圖片2


WITH t1 AS (
SELECT 
X.類別,X.成本,X.目標,X.目標管理職,
SUM(CASE WHEN 階數 = '1' THEN 重計投入 ELSE null END) 投入量1,
SUM(CASE WHEN 階數 = '1' THEN 產出 ELSE null END) 入庫1,
SUM(CASE WHEN 階數 = '2' THEN 重計投入 ELSE null END) 發料量,
SUM(CASE WHEN 階數 = '2' THEN 產出 ELSE null END) 入庫2,
SUM(CASE WHEN 階數 = '2' THEN 回算 ELSE null END) 入庫2回算
FROM table X
LEFT JOIN table D ON X.類別=D.分群

WHERE FACTORY = '' AND 工單別 = '量產' AND 結案日 = to_date('20211111', 'yyyy-MM-dd') GROUP BY X.類別,X.成本,X.目標,X.目標管理職)

,t2 AS (SELECT t1.類別,t1.成本,t1.投入量1,t1.入庫1,t1.發料量,t1.入庫2,t1.入庫2回算,t1.目標,t1.目標管理職,
CASE WHEN NVL(t1.投入量1,0)=0 THEN null ELSE LEAST(t1.入庫1 / t1.投入量1 * 100, 100) END 良率1,
CASE WHEN NVL(t1.發料量,0)=0 THEN null ELSE LEAST((t1.入庫2 - t1.入庫2回算) / t1.發料量 * 100, 100) END 良率2,
CASE WHEN NVL(t1.發料量,0)=0 THEN null ELSE LEAST(t1.入庫2 / t1.發料量 * 100, 100)END  良率2回算
FROM t1)

,t4 AS (SELECT 
t2.品目 品目,
t2.成本 成本,
ROUND(t2.入庫1,0)入庫1,
ROUND(t2.良率1, 2) 良率1,
ROUND(t2.發料量,0)發料量,
ROUND(t2.入庫2,0) - round(t2.入庫2回算,0) 入庫2,
ROUND(t2.良率2, 2) 良率2,
ROUND((t2.良率1 * t2.良率2) / 100, 2) 良率,
ROUND(CASE WHEN NVL(t2.入庫2回算,0)=0 THEN null  ELSE t2.入庫2回算 END) 入庫2回算,
ROUND(t2.良率2回算, 2) 良率2回算,
ROUND((t2.良率1 * t2.良率2回算) / 100, 2) 良率回算,
t2.目標,
t2.目標管理職
FROM t2 )

,t3 AS (
SELECT 
COALESCE(t2.類別, '總良率') 類別,
ROUND(SUM(t2.投入量1), 0) 投入量1,
ROUND ((SUM((t2.成本) * (t2.投入量1) *ROUND((t2.良率1 * t2.良率2) / 100, 2))) / SUM((t2.成本)* round(t2.投入量1,2)),2)良率--總良率計算公式
FROM t2
GROUP BY ROLLUP (t2.類別))

SELECT 
t3.類別,
t4.成本,
t3.投入量1,
t4.入庫1,
t4.良率1,
t4.發料量,
t4.入庫2,
t4.良率2,
t3.良率,
t4.入庫2回算,
t4.良率2回算,
t4.良率回算,
t4.目標,
t4.目標管理職
FROM t3
FULL JOIN t4 ON t3.類別=t4.類別 
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
5
純真的人
iT邦大師 1 級 ‧ 2021-11-12 13:54:42
最佳解答

這個應該卡在小數點有四捨五入的問題吧~
若會這樣~應該先把第一次得到的結果~再加總計算到總計去~

若直接計算總計~可能就會有你的1數值誤差問題吧~

因為我看你用了ROUND函數

看更多先前的回應...收起先前的回應...

我照你方法試過了,數值還是同樣會少1

我後來用你建議的寫法,多加了這個語法,就解決了

需要進行 ROUND() 的欄位,該欄位資料型態建議不要用 float、real,應該用 decimal、numeric

,t2 AS (SELECT t1.類別,t1.成本,t1.投入量1,t1.入庫1,t1.發料量,t1.入庫2,t1.入庫2回算,t1.目標,t1.目標管理職,
CASE WHEN NVL(t1.投入量1,0)=0 THEN null ELSE LEAST(t1.入庫1 / t1.投入量1 * 100, 100) END 良率1,
CASE WHEN NVL(t1.發料量,0)=0 THEN null ELSE LEAST((t1.入庫2 - t1.入庫2回算) / t1.發料量 * 100, 100) END 良率2,
CASE WHEN NVL(t1.發料量,0)=0 THEN null ELSE LEAST(t1.入庫2 / t1.發料量 * 100, 100)END  良率2回算
***多加了下面這寫法***
round (cast(t1.投入量1 as decimal)) 投入量X
***多加了下面這寫法***
FROM t1)

恩恩~找到解決方法就好~加油~

謝謝你,你的方法,我也是會多練習

2
海綿寶寶
iT邦大神 1 級 ‧ 2021-11-12 16:16:36

問題是解決了
但我覺得比較好的解法是改寫成第三種寫法
也就是
不管1到9列公式多麼複雜,算得天花亂墜
第10列的總計只要單純的「加總」1到9列就好
而不是「重算一次」

現在這種寫法
若以後有任何計算公式修改
都要改兩個地方

好的,謝謝你的建議,我會再多練習和嘗試

2
rogeryao
iT邦超人 8 級 ‧ 2021-11-12 17:06:25

這問題就像是採購單的總金額問題一樣,這次少算 1 下次可能多算 1 :
1.每一筆都做四捨五入
2.總金額計算方法:
A : 總金額 = SUM(四捨五入(每一筆)) <= 方法三 : 表格的數據會一致,但是金額可能會差 9 (9 筆都進位或捨棄了)
B : 總金額 = 四捨五入(SUM(每一筆)) : 表格的數據可能會不一致,但是金額最多會差 1
至於用 A 方法或是 B 方法,建議問問要看報表的人吧。

看更多先前的回應...收起先前的回應...
ckp6250 iT邦好手 1 級 ‧ 2021-11-12 17:17:49 檢舉

A和B的方法,在【單筆資料】底下,都有效,不過,若來到財政部的營業稅申報,就會失效。

因為,稅法規定,是當期開立發票總數再X稅率,所以,仍然存有四捨五入問題。

ckp6250
我司報稅一律採無條件進位@@..沒有四捨五入問題~
即使1.1元也會變成2元

謝謝兩位的近期分享和建議,建議的方法我都多再多練習跟嘗試
也是主管說要跟EXCEL報表的數據完全一模一樣,所以就是會有一些許的麻煩

msn1939 iT邦新手 4 級 ‧ 2021-11-13 13:42:49 檢舉

主管外行

我要發表回答

立即登入回答