簡體   English   中英

表列數據到多行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM