iT邦幫忙

0

如何使用SQL的 CASE將四個不同表單連貫後,最終得到的新值來自於其中2個的表單其中一值

sql

A表單、B表單、C表單、D表單
如果A.A1=B.B1則,新增一值(A.A2)=B.B2 否則 A.A2=D.D3

【A.A2為新增的欄位,其值取之B.B2或D.D3】

A與B表單的連接為:A.A1=B.B1
A與C、D表單的連接為:A.A1=C.C1,C.C2=D.D2

看更多先前的討論...收起先前的討論...
抱歉,你是想問新增還是問取值??

搞不懂你的問題點在哪。是不會新增還是不會取值???

提示:
取得新增的資料 = 取值
取得資料 = 取值

所以你的問題點是「新增」還是「取值」。什麼是新增後的取值??
mj4695 iT邦新手 5 級 ‧ 2019-08-01 14:53:04 檢舉
【A.A2為新增的欄位,其值取之B.B2或D.D3】....這樣寫不知,您是否看得懂!!
這樣寫不知,您是否看得懂!! <-- 這年頭問問題的,是這種態度喔.
mj4695 iT邦新手 5 級 ‧ 2019-08-01 19:30:02 檢舉
很抱歉,也許我這樣的用詞讓您看得不順心,但這並不是我輕漫的態度,我只想知道我這樣的寫法,是否能讓幫忙我解決的人看得懂,真的很抱歉!!!
最好是舉實例, 會比較清楚. 既然要發問了, 就盡量描述清楚點, 實在很難描述,畫圖補助也是一個辦法,在紙上畫,拍張照,傳上來. 要設法讓別人理解,才好幫助你.

2 個回答

1
張小馬~
iT邦新手 3 級 ‧ 2019-08-01 15:29:41

全部先join進來,再做CASE WHEN。

select
A.A1,
B.B1,
B.B2,
D.D3,
CASE WHEN A.A1=B.B1 THEN B.B2 ELSE D.D3 END A2
from A
LEFT JOIN B on A.A1=B.B1
LEFT JOIN C on A.A1=C.C1
LEFT JOIN D on C.C2=D.D2

可能原問題這句會讓人有點看不懂:
【如果A.A1=B.B1則,新增一值(A.A2)=B.B2 否則 A.A2=D.D3】
在SQL裡的順序是,先把值做出來(先把這個欄位做出來),再給這個欄位命名。
簡單來說,這句話應該改成這樣:

  1. 建立一個新欄位,如果A.A1=B.B1,則填入B.B2,否則填入D.D3。
  2. 把這個新欄位命名成A2

話說回來,當你把ABCD做完join後,它已經不是原本的A表,可以想像成新的表,當作E表好了。也因此,不會有所謂的A.A2。A2只屬於E表,這個你新建的表的新欄位。

至於你接著是不是想把【擁有A2這個新欄位的E表】,命名成A表,或是取代掉舊的A表;或是從E表中取出A2這個欄位,插回原本舊的A表中,這些都是另外一回事,是之後的動作。

看更多先前的回應...收起先前的回應...
mj4695 iT邦新手 5 級 ‧ 2019-08-01 19:37:50 檢舉

謝謝您....我會先試著照您的方式來試看看....我會在努力將問題寫的更明暸一點....謝謝!!

mj4695 iT邦新手 5 級 ‧ 2019-08-02 14:46:10 檢舉

1.將case的那一段刪掉...我的sql有驗證過
2.將case中新欄位(RMAMI.MI300)刪掉,出現的錯誤訊息"運算式無效,已找到空白行的資料名稱"
https://ithelp.ithome.com.tw/upload/images/20190802/20119498NkSLx18BDl.png

RMAMI.MI300這個是重點,【MI300】就好了,前面不要冠上【RMAMI】,我原回答在講【不會有所謂的A.A2】就是在講這件事。同理,不會有所謂的【RMAMI.MI300】,因為MI300是你新建立出來的欄位,不存在於RMAMI這張表裡面。也因此當你把【RMAMI.MI300】整個刪掉時,等於是沒有對這個你新建的欄位作命名,警告跳「空白行的資料名稱」XDD,看起來好敖口,意思就是你沒有對你新建的欄位做命名啦~
你看我原回答,END的後面直接是A2,而不是A.A2。多問一下,我是用postgreSQL,你是用什麼的?

然後我看到你group by又放了RMAMI.MI300,這不對,不能在同一層做,因為這層它還不知道你的MI300是什麼啊~(你解決前面的欄位命名之後,應該馬上又會遇到這個問題,一步步來吧~)

mj4695 iT邦新手 5 級 ‧ 2019-08-02 15:15:11 檢舉

目前成功驗算過了,不過...還要到另一邊的軟體試..才知到底行不行,我也不知是什麼sql,看它的說明好像是sap 出的,我才剛開始練sql,所以很多東西問的也會讓你們看不懂...真的很謝謝您!!!

https://ithelp.ithome.com.tw/upload/images/20190802/20119498JDR1K6dZQA.png

不用客氣,從發問中看得出是SQL新手,網路上許多專業IT對發問的用字遣詞很敏感,不要放在心上,我一點都不專業所以不會在意,有幫助到比較重要。

mj4695 iT邦新手 5 級 ‧ 2019-08-05 11:05:16 檢舉

卡住了....我不知如何對新增的A2值在何處對將其表單告知為E表....

【話說回來,當你把ABCD做完join後,它已經不是原本的A表,可以想像成新的表,當作E表好了。也因此,不會有所謂的A.A2。A2只屬於E表,這個你新建的表的新欄位。】

-->我要在何處宣告此單為 E 表

至於你接著是不是想把【擁有A2這個新欄位的E表】,命名成A表,或是取代掉舊的A表;或是從E表中取出A2這個欄位,插回原本舊的A表中,這些都是另外一回事,是之後的動作。

--> 是不是要像 rogeryao 大大所輸入的 在from 的後面將原 a 表 AS E 表,如果是這樣...那我在所有SELECT 下所選的其他A表的欄位,同樣的都要改為E.A1....,還是也可以用其他的方式做,例如像 rogeryao,或是用包層(是用這個詞嗎)的方式...

mj4695 iT邦新手 5 級 ‧ 2019-09-16 16:39:22 檢舉

小馬大大...
我已另外建立一張E單,但卻發現我的D.D3這邊是有資料的,但B.B2卻是沒資料..
**** E單 ***
SELECT
RMAMI.MI002,
RMAMI.MI200,
RMAMI.MI201,
RMAMI.MI207,
B.TC001,
B.TC002,
B.TC011,
D.TC006,
D.TC004,
CASE WHEN RMAMI.MI200=B.TC002 THEN B.TC011 ELSE D.TC006 END MI300
FROM
RMAMI

LEFT JOIN PURTC AS B ON (RMAMI.MI200=B.TC002 and B.TC001='334' )
LEFT JOIN MOCTA AS C ON (RMAMI.MI200=C.TA063)
INNER JOIN COPTC AS D ON (C.TA026=D.TC001 AND C.TA027=D.TC002)

GROUP BY RMAMI.MI002,RMAMI.MI201,RMAMI.MI207,RMAMI.MI200,B.TC001,B.TC002,B.TC011,D.TC006 ,D.TC004


但我也有試過將JOIN過去D單的資料刪除...這樣我的B單的資料是有的
SELECT
RMAMI.MI002,
RMAMI.MI200,
RMAMI.MI201,
RMAMI.MI207,
B.TC001,
B.TC002,
B.TC011,

CASE WHEN RMAMI.MI200=B.TC002 THEN B.TC011   END MI300

FROM
RMAMI

LEFT JOIN PURTC AS B ON (RMAMI.MI200=B.TC002 and B.TC001='334' )

GROUP BY RMAMI.MI002,RMAMI.MI201,RMAMI.MI207,RMAMI.MI200,B.TC001,B.TC002,B.TC011

0
rogeryao
iT邦高手 6 級 ‧ 2019-08-01 17:22:05
Update P
Set P.A2=CASE WHEN P.A1=B.B1 THEN B.B2 ELSE D.D3 END
FROM A AS P
LEFT JOIN B ON P.A1=B.B1
LEFT JOIN C ON P.A1=C.C1
LEFT JOIN D ON C.C2=D.D2
mj4695 iT邦新手 5 級 ‧ 2019-08-01 19:38:52 檢舉

謝謝您...我明天也會試看看...

我要發表回答

立即登入回答