[英]Table columns data to multiple rows
在數據遷移期間,我遇到了一些奇怪的數據庫設計,並試圖將表數據轉換為更規范的形式。 在這里,員工屬於各個職位,而“員工位置”表如下所示: EmpNo, Position1, SalCode1, Position2, SalCode2, Position3, SalCode3, Position4, SalCode4
等。
EmpNo Position01 SalCodeS01 Position02 SalCodeS02 Position03 SalCodeS03
E123 EL028 ENADV EL029 ENADV BF046 ENADV
E125 EL028 LHENAD EL029 LHENAD BF046 LHENAD
E126 EL049 LHENAD BF046 LHENAD BF047 LHENAD
E127 EL028 LHENAD EL029 LHENAD BF046 LHENAD
E128 EL028 LHENAD EL029 LHENAD BF046 LHENAD
E129 EL049 LHENAD BF046 LHENAD BF047 LHENAD
嘗試標准化EmpNo, Position, SalCode
EmpNo Position SalCode
E123 EL028 ENADV
E123 EL029 ENADV
E123 BF046 ENADV
E123 BF047 ENADV
E125 EL028 LHENAD
E125 EL029 LHENAD
E125 BF046 LHENAD
E125 BF047 LHENAD
有誰能建議最好的方法來做到這一點? 可能有PIVOT嗎? 謝謝。 PS。 請注意,我僅具有SELECT權限,這是JOIN中4個表中的一個表
可能是這樣的:
select EmpNo, Position01 as Position, SalCodeS01 as SalCode from employees_table
union
select EmpNo, Position02 as Position, SalCodeS02 as SalCode from employees_table
union
select EmpNo, Position03 as Position, SalCodeS03 as SalCode from employees_table
order by EmpNo, Position
我建議您編寫一個過程來執行此任務。 定義一個游標,並為該游標的每次迭代執行此操作。
INSERT INTO employee_positions_new (EmpNo, Position01, SalCodeS01);
INSERT INTO employee_positions_new (EmpNo, Position02, SalCodeS02);
INSERT INTO employee_positions_new (EmpNo, Position03, SalCodeS03);
CREATE TABLE #temp
(
EmpNo VARCHAR(50),
Position01 VARCHAR(50),
SalCodeS01 VARCHAR(50),
Position02 VARCHAR(50),
SalCodeS02 VARCHAR(50),
Position03 VARCHAR(50),
SalCodeS03 VARCHAR(50)
)
INSERT INTO #temp
(EmpNo,Position01,SalCodeS01,Position02,
SalCodeS02,Position03,SalCodeS03)
VALUES ('E123','EL028','ENADV','EL029',
'ENADV','BF046','ENADV'),
('E125','EL028','LHENAD','EL029',
'LHENAD','BF046','LHENAD'),
('E126','EL049','LHENAD','BF046',
'LHENAD','BF047','LHENAD')
SELECT A.EmpNo,
a.Position,
b.SalCode
FROM (SELECT empno,
Split.a.value('.', 'VARCHAR(100)') Position
FROM (SELECT empno,
Cast ('<M>'
+ Replace(Position01+','+Position02+','+Position03, ',', '</M><M>')
+ '</M>' AS XML) AS Data
FROM #temp) AS A
CROSS APPLY Data.nodes ('/M') AS Split(a)) A
JOIN (SELECT empno,
Split.a.value('.', 'VARCHAR(100)') SalCode
FROM (SELECT empno,
Cast ('<M>'
+ Replace(SalCodeS01+','+SalCodeS02+','+SalCodeS03, ',', '</M><M>')
+ '</M>' AS XML) AS Data
FROM #temp) AS A
CROSS APPLY Data.nodes ('/M') AS Split(a)) B
ON a.EmpNo = b.EmpNo
OUTPUT
EmpNo Position SalCode
E123 EL028 ENADV
E123 EL029 ENADV
E123 BF046 ENADV
E123 EL028 ENADV
E123 EL029 ENADV
E123 BF046 ENADV
E123 EL028 ENADV
E123 EL029 ENADV
E123 BF046 ENADV
E125 EL028 LHENAD
E125 EL029 LHENAD
E125 BF046 LHENAD
E125 EL028 LHENAD
E125 EL029 LHENAD
E125 BF046 LHENAD
E125 EL028 LHENAD
E125 EL029 LHENAD
E125 BF046 LHENAD
E126 EL049 LHENAD
E126 BF046 LHENAD
E126 BF047 LHENAD
E126 EL049 LHENAD
E126 BF046 LHENAD
.......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.