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
全部先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裡的順序是,先把值做出來(先把這個欄位做出來),再給這個欄位命名。
簡單來說,這句話應該改成這樣:
話說回來,當你把ABCD做完join後,它已經不是原本的A表,可以想像成新的表,當作E表好了。也因此,不會有所謂的A.A2
。A2只屬於E表,這個你新建的表的新欄位。
至於你接著是不是想把【擁有A2這個新欄位的E表】,命名成A表,或是取代掉舊的A表;或是從E表中取出A2這個欄位,插回原本舊的A表中,這些都是另外一回事,是之後的動作。
謝謝您....我會先試著照您的方式來試看看....我會在努力將問題寫的更明暸一點....謝謝!!
1.將case的那一段刪掉...我的sql有驗證過
2.將case中新欄位(RMAMI.MI300)刪掉,出現的錯誤訊息"運算式無效,已找到空白行的資料名稱"
RMAMI.MI300這個是重點,【MI300】就好了,前面不要冠上【RMAMI】,我原回答在講【不會有所謂的A.A2】就是在講這件事。同理,不會有所謂的【RMAMI.MI300】,因為MI300是你新建立出來的欄位,不存在於RMAMI這張表裡面。也因此當你把【RMAMI.MI300】整個刪掉時,等於是沒有對這個你新建的欄位作命名,警告跳「空白行的資料名稱」XDD,看起來好敖口,意思就是你沒有對你新建的欄位做命名啦~
你看我原回答,END的後面直接是A2,而不是A.A2。多問一下,我是用postgreSQL,你是用什麼的?
然後我看到你group by又放了RMAMI.MI300,這不對,不能在同一層做,因為這層它還不知道你的MI300是什麼啊~(你解決前面的欄位命名之後,應該馬上又會遇到這個問題,一步步來吧~)
目前成功驗算過了,不過...還要到另一邊的軟體試..才知到底行不行,我也不知是什麼sql,看它的說明好像是sap 出的,我才剛開始練sql,所以很多東西問的也會讓你們看不懂...真的很謝謝您!!!
不用客氣,從發問中看得出是SQL新手,網路上許多專業IT對發問的用字遣詞很敏感,不要放在心上,我一點都不專業所以不會在意,有幫助到比較重要。
卡住了....我不知如何對新增的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,或是用包層(是用這個詞嗎)的方式...
小馬大大...
我已另外建立一張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
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