我使用的db是 Oracle client,已有試過使用sum、where、group by的指令,但還是錯誤,不知道要怎麼解了 @@a
因此要請教各位,如何把直行的數字由上往下的全加總起來(藍色框),計算的結果需要放在此直行欄位的最底下,並對應第29格的欄位(紅色框),謝謝各位。
其實我是要從兩個張不同的table合併資料並計算總計
原本只有28個項目,而總計要加入當第29個項目,並將投入量1加總,將總計的結果放在最底下欄位,對應到第29個項目"總計"。
補充我的資料庫字串及SQL的欄位圖示
with t1 as (
SELECT 分群, sum(重計投入量) 投入量1,sum(產出_M2) 入庫量1, LEAST(sum(產出_M2)/sum(重計投入量)*100,100) 量產1
from tableName
where FACTORY='@@' and 工單別='量產' and 階數='1' and 結案日=to_date('20211107', 'yyyy-MM-dd')
group by 分群)
, t2 as (
SELECT 分群, sum(重計投入量) 發料量,sum(產出_M2) 入庫量2,sum(邊料回算_M2) 入庫量2回, LEAST((sum(產出_M2)-sum(邊料回算_M2))/sum(重計投入量)*100,100) 量產2, LEAST(sum(產出_M2)/sum(重計投入量)*100,100) 量產2回
from tableName
where FACTORY='@@' and 工單別='量產' and 階數='2' and 結案日=to_date('20211107', 'yyyy-MM-dd')
group by 分群)
,t3 as(SELECT 品目類別 from YIELD_NAME)
select t3.品目類別, round(t1.投入量1,0) 投入量1, round(t1.入庫量1,0) 入庫量1, round(t1.量產1,2) 量產1
, round(t2.發料量,0) 發料量, round(t2.入庫量2,0) - round(t2.入庫量2回,0) 入庫量2, round(t2.量產2,2) 量產2,
round(t1.量產1*t2.量產2/100,2) 量產,round(t2.量產2回,2) 量產2回,
round(t1.量產1*t2.量產2回/100,2) 量產回,round(t2.入庫量2回,0) 工單入庫量2回
from t1 full join t2 on (t1.分群=t2.分群) full join t3 on(t1.分群=t3.品目類別) where t3.品目類別 is not null
order by 1;
CREATE TABLE employee
(
department VARCHAR(50) NOT NULL,
salary INT
);
INSERT INTO employee
VALUES ('Sales', 5000);
INSERT INTO employee
VALUES ('HR', 6000);
INSERT INTO employee
VALUES ('IT', 7500);
INSERT INTO employee
VALUES ('Marketing', NULL);
INSERT INTO employee
VALUES ('Finance', 5500);
INSERT INTO employee
VALUES ('Sales', 8000);
SELECT COALESCE (department, '總計') AS Department,SUM(salary) AS Salary_Sum
FROM employee
GROUP BY ROLLUP (department)
-- 方法一 : 所有欄位皆加總
WITH M AS (
SELECT
X.品目類別,
SUM(CASE WHEN 階數 = '1' THEN 重計投入量 ELSE 0 END) 投入量1,
SUM(CASE WHEN 階數 = '1' THEN 產出_M2 ELSE 0 END) 入庫量1,
SUM(CASE WHEN 階數 = '2' THEN 重計投入量 ELSE 0 END) 發料量,
SUM(CASE WHEN 階數 = '2' THEN 產出_M2 ELSE 0 END) 入庫量2,
SUM(CASE WHEN 階數 = '2' THEN 邊料回算_M2 ELSE 0 END) 入庫量2回
FROM YIELD_NAME X
LEFT JOIN tableName D ON X.品目類別=D.分群
/*
WHERE FACTORY = '@@'
AND 工單別 = '量產'
AND 結案日 = to_date('20211107', 'yyyy-MM-dd')
*/
GROUP BY X.品目類別
)
,K AS (
SELECT
M.品目類別,
M.投入量1,
M.入庫量1,
M.發料量,
M.入庫量2,
M.入庫量2回,
CASE WHEN NVL(M.投入量1,0)=0 THEN 0 ELSE LEAST(M.入庫量1 / M.投入量1 * 100, 100) END 量產1,
CASE WHEN NVL(M.發料量,0)=0 THEN 0 ELSE LEAST((M.入庫量2 - M.入庫量2回) / M.發料量 * 100, 100) END 量產2,
CASE WHEN NVL(M.發料量,0)=0 THEN 0 ELSE LEAST(M.入庫量2 / M.發料量 * 100, 100)END 量產2回
FROM M
)
SELECT
COALESCE (K.品目類別, '總計') 品目類別,
ROUND(SUM(K.投入量1), 0) 投入量1,
ROUND(SUM(K.入庫量1), 0) 入庫量1,
ROUND(SUM(K.量產1), 2) 量產1,
ROUND(SUM(K.發料量), 0) 發料量,
ROUND(SUM(K.入庫量2), 0) - ROUND(SUM(K.入庫量2回), 0) 入庫量2,
ROUND(SUM(K.量產2), 2) 量產2,
ROUND(SUM(K.量產1 * K.量產2) / 100, 2) 量產,
ROUND(SUM(K.量產2回), 2) 量產2回,
ROUND(SUM(K.量產1 * K.量產2回) / 100, 2) 量產回,
ROUND(SUM(K.入庫量2回), 0) 工單入庫量2回
FROM K
GROUP BY ROLLUP (K.品目類別);
-- 方法二 : 部分欄位加總
WITH M AS (
SELECT
X.品目類別,
SUM(CASE WHEN 階數 = '1' THEN 重計投入量 ELSE 0 END) 投入量1,
SUM(CASE WHEN 階數 = '1' THEN 產出_M2 ELSE 0 END) 入庫量1,
SUM(CASE WHEN 階數 = '2' THEN 重計投入量 ELSE 0 END) 發料量,
SUM(CASE WHEN 階數 = '2' THEN 產出_M2 ELSE 0 END) 入庫量2,
SUM(CASE WHEN 階數 = '2' THEN 邊料回算_M2 ELSE 0 END) 入庫量2回
FROM YIELD_NAME X
LEFT JOIN tableName D ON X.品目類別=D.分群
/*
WHERE FACTORY = '@@'
AND 工單別 = '量產'
AND 結案日 = to_date('20211107', 'yyyy-MM-dd')
*/
GROUP BY X.品目類別
)
,K AS (
SELECT
M.品目類別,
M.投入量1,
M.入庫量1,
M.發料量,
M.入庫量2,
M.入庫量2回,
CASE WHEN NVL(M.投入量1,0)=0 THEN 0 ELSE LEAST(M.入庫量1 / M.投入量1 * 100, 100) END 量產1,
CASE WHEN NVL(M.發料量,0)=0 THEN 0 ELSE LEAST((M.入庫量2 - M.入庫量2回) / M.發料量 * 100, 100) END 量產2,
CASE WHEN NVL(M.發料量,0)=0 THEN 0 ELSE LEAST(M.入庫量2 / M.發料量 * 100, 100)END 量產2回
FROM M
)
,F1 AS (
SELECT
COALESCE (K.品目類別, '總計') 品目類別,
ROUND(SUM(K.投入量1), 0) 投入量1,
ROUND(SUM(K.入庫量1), 0) 入庫量1,
ROUND(SUM(K.發料量), 0) 發料量,
ROUND(SUM(K.入庫量2), 0) - ROUND(SUM(K.入庫量2回), 0) 入庫量2,
ROUND(SUM(K.入庫量2回), 0) 工單入庫量2回
FROM K
GROUP BY ROLLUP (K.品目類別)
)
,F2 AS (
SELECT
K.品目類別 品目類別,
ROUND(K.量產1, 2) 量產1,
ROUND(K.量產2, 2) 量產2,
ROUND((K.量產1 * K.量產2) / 100, 2) 量產,
ROUND(K.量產2回, 2) 量產2回,
ROUND((K.量產1 * K.量產2回) / 100, 2) 量產回
FROM K
)
SELECT F1.品目類別,
F1.投入量1,
F1.入庫量1,
F2.量產1,
F1.發料量,
F1.入庫量2,
F2.量產2,
F2.量產,
F2.量產2回,
F2.量產回,
F1.工單入庫量2回
FROM F1
LEFT JOIN F2 ON F1.品目類別=F2.品目類別
-- 方法三 : 部分欄位加總,【純真的人】用的 UNION 方法
WITH M AS (
SELECT
X.品目類別,
SUM(CASE WHEN 階數 = '1' THEN 重計投入量 ELSE 0 END) 投入量1,
SUM(CASE WHEN 階數 = '1' THEN 產出_M2 ELSE 0 END) 入庫量1,
SUM(CASE WHEN 階數 = '2' THEN 重計投入量 ELSE 0 END) 發料量,
SUM(CASE WHEN 階數 = '2' THEN 產出_M2 ELSE 0 END) 入庫量2,
SUM(CASE WHEN 階數 = '2' THEN 邊料回算_M2 ELSE 0 END) 入庫量2回
FROM YIELD_NAME X
LEFT JOIN tableName D ON X.品目類別=D.分群
/*
WHERE FACTORY = '@@'
AND 工單別 = '量產'
AND 結案日 = to_date('20211107', 'yyyy-MM-dd')
*/
GROUP BY X.品目類別
)
,K AS (
SELECT
M.品目類別,
M.投入量1,
M.入庫量1,
M.發料量,
M.入庫量2,
M.入庫量2回,
CASE WHEN NVL(M.投入量1,0)=0 THEN 0 ELSE LEAST(M.入庫量1 / M.投入量1 * 100, 100) END 量產1,
CASE WHEN NVL(M.發料量,0)=0 THEN 0 ELSE LEAST((M.入庫量2 - M.入庫量2回) / M.發料量 * 100, 100) END 量產2,
CASE WHEN NVL(M.發料量,0)=0 THEN 0 ELSE LEAST(M.入庫量2 / M.發料量 * 100, 100)END 量產2回
FROM M
)
,P AS (
SELECT
K.品目類別 品目類別,
ROUND(K.投入量1, 0) 投入量1,
ROUND(K.入庫量1, 0) 入庫量1,
ROUND(K.量產1, 2) 量產1,
ROUND(K.發料量, 0) 發料量,
ROUND(K.入庫量2, 0) - ROUND(K.入庫量2回, 0) 入庫量2,
ROUND(K.量產2, 2) 量產2,
ROUND(K.量產1 * K.量產2 / 100, 2) 量產,
ROUND(K.量產2回, 2) 量產2回,
ROUND(K.量產1 * K.量產2回 / 100, 2) 量產回,
ROUND(K.入庫量2回, 0) 工單入庫量2回
FROM K
)
SELECT *
FROM P
UNION
SELECT
'總計' 品目類別,
SUM(投入量1) 投入量1,
SUM(入庫量1) 入庫量1,
NULL 量產1,
SUM(發料量) 發料量,
SUM(入庫量2) 入庫量2,
NULL 量產2,
NULL 量產,
NULL 量產2回,
NULL 量產回,
SUM(工單入庫量2回) 工單入庫量2回
FROM P
好的,謝謝你的熱心解惑,我會再試試看
這個其實要執行計算兩次~用union合起來~
declare @表格 table(
類別 nvarchar(50)
,投入量 int
)
select 類別
,Sum(投入量) 投入量
from @表格
group by 類別
union
select N'總計'
,Sum(投入量)
from @表格