我已重覆驗證多次,還是找不太出bug是什麼,想請問有經驗的各位
到底是為什麼會在加總後,數值仍舊會少 1
?!
謝謝
數值驗證正確結果
SQL計算卻少算了1
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.類別
這個應該卡在小數點有四捨五入的問題吧~
若會這樣~應該先把第一次得到的結果~再加總計算到總計去~
若直接計算總計~可能就會有你的1數值誤差問題吧~
因為我看你用了ROUND函數
我後來用你建議的寫法,多加了這個語法,就解決了
需要進行 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)
恩恩~找到解決方法就好~加油~
謝謝你,你的方法,我也是會多練習
問題是解決了
但我覺得比較好的解法是改寫成第三種寫法
也就是
不管1到9列公式多麼複雜,算得天花亂墜
第10列的總計只要單純的「加總」
1到9列就好
而不是「重算一次」
現在這種寫法
若以後有任何計算公式修改
都要改兩個地方
這問題就像是採購單的總金額問題一樣,這次少算 1 下次可能多算 1 :
1.每一筆都做四捨五入
2.總金額計算方法:
A : 總金額 = SUM(四捨五入(每一筆)) <= 方法三 : 表格的數據會一致,但是金額可能會差 9 (9 筆都進位或捨棄了)
B : 總金額 = 四捨五入(SUM(每一筆)) : 表格的數據可能會不一致,但是金額最多會差 1
至於用 A 方法或是 B 方法,建議問問要看報表的人吧。
ckp6250
我司報稅一律採無條件進位@@..沒有四捨五入問題~
即使1.1元也會變成2元
謝謝兩位的近期分享和建議,建議的方法我都多再多練習跟嘗試
也是主管說要跟EXCEL報表的數據完全一模一樣,所以就是會有一些許的麻煩
主管外行