iT邦幫忙

1

【Oracle SQL】根據不同條件參照同一個Table計算數值

各位前輩好!
平常都再潛水看各位前輩的文章
近日碰上一個SQL的關卡
想請教iT邦上的大神們

需求如下:

  1. 根據表A與表B(可以當成參數表)的關聯,計算出相關數值。
  2. 每一個表A的參數,無論何種年份,都會計算出對應的三種數值(MAX、MIN、CU)。
  3. 參數1根據部門、代碼、型號,對應表B的部門、代碼、機群,找到對應表B的參數,用以計算(如圖1)。
  4. 參數2根據部門、代碼、機型,對應表B的部門、代碼、機群,找到對應表B的參數,用以計算(如圖1)。
  5. 根據條件找到的表B,可能有不同年份,找到的年份都需要計算(如圖2)。
  6. 如同圖2中,表A的第1筆資料,找到2020、2019年參數,則皆需要計算,另外2019年只有表A的參數1可以計算,參數2則無法計算。
  7. 如同圖2中,表A的第2筆資料,如完全找不到對應的表B參數,則年份及參數皆顯示NULL(也可以整筆不顯示,無強制規定)。
  8. SQL希望具有擴充性,舉例來說,表A多了一個參數3需要計算(同樣參照表B),以此類推。

圖1為計算說明
圖2為範例

圖1
https://ithelp.ithome.com.tw/upload/images/20200824/20129681VaE61RPY1Y.png

圖2
https://ithelp.ithome.com.tw/upload/images/20200824/20129681HjZv0KdnhC.png

===========================================

如有甚麼描述不好的地方,會馬上補充 /images/emoticon/emoticon41.gif

你還是把table , 資料, 最後想達成目標,詳細說出來啦.
沒有資料,是要大家去想,幫你生資料. 這樣效果不會好.
用Excel貼圖,只能是補助, 那樣小, 又沒資料.
你去看以前發問的.就知道哪種好了.

另外 你在再不會分, 中文要學好,SQL才能寫得好.

1 個回答

0
LingLingJao
iT邦見習生 ‧ 2020-08-25 10:36:40
最佳解答

--參數1根據部門(DEP)、代碼(ID)、型號(TYPE),對應表B的部門、代碼、機群(EGROUP)
WITH C AS
(
SELECT A.DEP,A.ID,A.TYPE,A.MODEL,B.YYYY,
CASE WHEN B.KIND IS NOT NULL THEN '1_' || B.KIND ELSE B.KIND END AS Col_KIND,
(A.PARAM1B.PARAMETER) AS P_VALUE
FROM A
LEFT JOIN B ON A.DEP=B.DEP AND A.ID=B.ID AND A.TYPE=B.EGROUP
UNION ALL
--參數2根據部門、代碼、機型(MODEL),對應表B的部門、代碼、機群
SELECT A.DEP,A.ID,A.TYPE,A.MODEL,B.YYYY,
CASE WHEN B.KIND IS NOT NULL THEN '2_' || B.KIND ELSE B.KIND END AS Col_KIND,
(A.PARAM1
B.PARAMETER) AS P_VALUE
FROM A
LEFT JOIN B ON A.DEP=B.DEP AND A.ID=B.ID AND A.MODEL=B.EGROUP
)
SELECT * FROM C
PIVOT (
SUM(P_VALUE) FOR Col_KIND IN ('1_MAX','1_MIN','1_CU','2_MAX','2_MIN','2_CU')
)
https://ithelp.ithome.com.tw/upload/images/20200825/20129824Z8Y4W78hf6.png

你希望有參數3也能自動擴充,無法,因為你上方的參數1和2 JOIN條件不同,不知你往後的規律是如何?! 另外PIVOT的欄位LIST好像只能寫死,我也是剛剛參考網路,你可以在Google看可不可以寫活!

我要發表回答

立即登入回答