我想要把原有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.......
又若者根本不知道會有幾項時,
您要怎麼辦?