Cum separ valorile unei coloane în mai multe coloane în MS SQL-Server (Administrarea bazelor de date, Server Sql, T Sql, Pivot)

Ersi Nurcellari a intrebat.
a intrebat.

ID Contact No Ext Type
-- ---------- ---- ----
0001 75865558 123 work
0001 207586558 NULL home
0001 207586559 NULL cell
0001 746655558 321 work
0002 946655558 323 work
0002 2356841 NULL home
0003 6655558 NULL cell

Vreau să împart tabelul în

ID HPhone CPhone1 CPhone2 WPhone1 Ext1 WPhone2 Ext2
-- ---------- ---------- -------- --------- ---- --------- -----
0001 207586558 207586559 NULL 75865558 123 746655558 321
0002 2356841 NULL NULL 946655558 323 NULL NULL
0003 NULL 6655558 NULL NULL NULL NULL NULL

Orice id poate avea cel mult 1 HPhone, 2CPhones și 2 WPhones/Ext.

Sunt nou în domeniul bazelor de date așa că nu caut în mod special să mi se dea răspunsul, dar orice sfat despre cum pot împărți primul tabel în ceva similar cu al doilea tabel ar fi apreciat.

Comentarii

  • Any id can at most have 1 HPhone, 2CPhones, and 2 WPhones/Ext. -> cum este acest lucru constrâns / controlat? –  > Por Aaron Bertrand.
  • ghidul are doar câmpuri pentru 2 telefoane de lucru și 2 telefoane mobile, însă în tabel cell1 și cell2 ambele au tipul de „cell” și același lucru pentru work1 și work2 – -.  > Por Ersi Nurcellari.
  • Ghidul nu este singura poartă de acces la tabel, așa că m-aș asigura că astfel de lucruri sunt restricționate corespunzător cât mai aproape posibil de date. –  > Por Aaron Bertrand.
1 răspunsuri
Aaron Bertrand

Acest lucru sună ca un PIVOT, , dar acestea devin rapid dezordonate atunci când pivotezi mai multe lucruri în mod condiționat. Așadar, aș folosi MAX/CASE agregate, ca acesta (CTE-ul este folosit pentru a oferi o ordine deterministă pentru numere de același tip; dacă doriți să schimbați acest lucru, schimbați pur și simplu ORDER BY în interiorul lui OVER() clauza):

;WITH x AS 
(
  SELECT *, rn = ROW_NUMBER() OVER 
            (PARTITION BY ID, [Type] ORDER BY [Contact No])
  FROM dbo.SourceTable
)
SELECT ID, 
  HPhone  = MAX(CASE WHEN [Type] = 'home' THEN [Contact No] END),
  CPhone1 = MAX(CASE WHEN [Type] = 'cell' AND rn = 1 THEN [Contact No] END),
  CPhone2 = MAX(CASE WHEN [Type] = 'cell' AND rn = 2 THEN [Contact No] END),
  WPhone1 = MAX(CASE WHEN [Type] = 'work' AND rn = 1 THEN [Contact No] END),
  Ext1    = MAX(CASE WHEN [Type] = 'work' AND rn = 1 THEN [Ext] END),
  WPhone2 = MAX(CASE WHEN [Type] = 'work' AND rn = 2 THEN [Contact No] END),
  Ext2    = MAX(CASE WHEN [Type] = 'work' AND rn = 2 THEN [Ext] END)
FROM x
GROUP BY ID
ORDER BY ID;