我想要把原有TABLE的資料橫向轉直向
資料類似下方這樣的格式
<原始資料>
產品 文件階段 文件編號
A    DR1      111
A    DR2      222
B    DR1      456
B    DR2      789 
C    DR2      888
D    DR1      999
<需求結果>
產品 DR1文件編號 DR2文件編號
A    111        222
B    456        789
C               888
D    999
產品只會有兩種文件階段(DR1、DR2)
但不一定都會有編號
請問該如何下SQL才可以得到需求結果的樣貌
再請各位指教
謝謝
CREATE TABLE T
	([產品] varchar(1), [文件階段] varchar(3), [文件編號] int)
;
	
INSERT INTO T
	([產品], [文件階段], [文件編號])
VALUES
	('A', 'DR1', 111),
	('A', 'DR2', 222),
	('B', 'DR1', 456),
	('B', 'DR2', 789),
	('C', 'DR2', 888),
	('D', 'DR1', 999)
;
select 
    產品,
    max(case when [文件階段] = 'DR1' then [文件編號] end) as [DR1文件階段],
    max(case when [文件階段] = 'DR2' then [文件編號] end) as [DR2文件階段]
from T
group by 產品
線上測試連結 : here

假如要做動態版本,可以參考我之前在S.O的回答
sql server - Splitting dynamically SQL columns into multiple columns based on a different column value - Stack Overflow
Neish
因為受限group語法,需要使用min or max取得分組的第一筆文件編號
如果是MySql有可能不用MAX,
因為MySql的GROUP BY預設會取第一筆,
像這個例子應該是只會有一筆,
所以沒差.
MS-SQL就一定要了,
否則會回傳錯誤.
我是用MySQL
難怪我想說去除MAX結果還是有跑出來
感謝兩位協助!
不對欸! 我重新確認還是要加MAX
不然只會抓到DR1的編號
可以用子查詢
現在沒時間測試,
你試試看
SELECT 產品,
(SELECT IFNULL(文件編號, '') FROM TABLE WHERE 文件階段 = 'DR1' AND 產品 = a.產品) AS DR1文件編號,
(SELECT IFNULL(文件編號, '') FROM TABLE WHERE 文件階段 = 'DR2' AND 產品 = a.產品) AS DR2文件編號
FROM TABLE AS a
GROUP BY 產品
這類資料橫向轉直向的需求,
我覺得最好是寫成 prodedure
然後利用類似
SET @query="............";
PREPARE QUERY FROM @query;
EXECUTE QUERY;
的動態方式去組合 @query 處理較妥,
否則,目前只有兩種文件階段(DR1、DR2)當然好處理,
但以後若增加了 DR3,DR4,DR5.......
又若者根本不知道會有幾項時,
您要怎麼辦?