原本資料為是二欄位(Number/color),每欄資料如下表示
Number:A
color:紅、黃
Number:B
color:黑
Number:C
color:黃
Number:D
color:紅、黃、黑
想用sql查詢出來為四欄位(Number/紅/黃/黑), 每欄資料如下表示
Number:A
紅:Y
黃:Y
黑:
Number:B
紅:
黃:
黑:Y
Number:C
紅:
黃:Y
黑:
Number:D
紅:Y
黃:Y
黑:Y
不考慮color自由變動~若固定顏色如下~
declare @Tmp table(
Number nvarchar(10)
,color nvarchar(10)
)
insert into @Tmp
values('A','紅、黃')
,('B','黑')
,('C','黑')
,('D','紅、黃、黑')
select Number
,(case when CharIndex('紅',color) > 0 then 'Y' else '' end) as [紅]
,(case when CharIndex('黃',color) > 0 then 'Y' else '' end) as [黃]
,(case when CharIndex('黑',color) > 0 then 'Y' else '' end) as [黑]
from @Tmp
我加上Oracle寫法~
create table Tmp(
Num VARCHAR2(10)
,color VARCHAR2(50)
)
insert into Tmp(Num,color) values('A','紅、黃');
insert into Tmp(Num,color) values('B','黑');
insert into Tmp(Num,color) values('C','黑');
insert into Tmp(Num,color) values('D','紅、黃、黑');
select Num
,(case when instr(color,'紅') > 0 then 'Y' else ' ' end) as 紅
,(case when instr(color,'黃') > 0 then 'Y' else ' ' end) as 黃
,(case when instr(color,'黑') > 0 then 'Y' else ' ' end) as 黑
from Tmp
你好,我用出來會出現這種錯誤訊息。。
ORA-00923: 在應出現的位置找不到 FROM 關鍵字
00923. 00000 - "FROM keyword not found where expected"
會是因為我的資料為紅,黃
中間會有,嗎
我的是Oracle sql,會是因為不一樣的資料庫嗎
what0208
對~因為你沒有指出哪個資料庫~我就用Sql Server的SQL
請問Oracle的語法該怎麻串呢?
我也以為是MSSQL,建議修改標題註明Oracle
what0208
加上Oracle寫法~
這個叫做 row to column
它的值可以完全一樣嗎,才給Y?
例如:
A紅黃,紅
B紅黃
C紅
會變成
A紅黃Y,紅Y
B紅黃Y,紅Y
C紅黃Y,紅Y
只要是有一樣的字就會被Y
像這樣https://dbfiddle.uk/3WZQ4JJE
C的部份就錯了,應該只會有一個Y才對,它的功能是像LIKE,是否=的?
what0208
可以用加上【、】來區隔單一顏色別~
select Num
,(case when instr('、' || color || '、','、紅黃、') > 0 then 'Y' else ' ' end) as 紅黃
,(case when instr('、' || color || '、','、紅、') > 0 then 'Y' else ' ' end) as 紅
from Tmp
提供一個 pivot 寫法
oracle輸入''會自動轉成null所以這邊就不做null判斷
如果樓主是要' ',再用null判斷即可(NVL)
SELECT *
FROM (
SELECT Num, regexp_substr(color, '[^、]+', 1, level) color,'Y' Agg
FROM (SELECT Num, color FROM test)
CONNECT BY instr(color, '、', 1, level - 1) > 0
) t
PIVOT (
MAX(Agg)
FOR color IN ('紅' 紅, '黃' 黃, '黑' 黑)
) p
SELECT Num
,NVL(紅,' ') 紅
,NVL(黃,' ') 黃
,NVL(黑,' ') 黑
FROM (
SELECT Num, regexp_substr(color, '[^、]+', 1, level) color,'Y' Agg
FROM (SELECT Num, color FROM test)
CONNECT BY instr(color, '、', 1, level - 1) > 0
) t
PIVOT (
MAX(Agg)
FOR color IN ('紅' 紅, '黃' 黃, '黑' 黑)
) p