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
テーブルを分割したい
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
任意のIDは、最大で1つのHPhone、2CPhones、および2つのWPhones/Extを持つことができます。
データベースに不慣れなため、特に答えを求めているわけではありませんが、最初のテーブルを2番目のテーブルに似たものに分割する方法についてのアドバイスがあれば幸いです。
これはPIVOT
のように聞こえますが、複数のものを条件付きでピボットしている場合、すぐに混乱します。したがって、私は次のようにMAX/CASE
集計を使用します(CTEは同じ型の数値に確定的な順序を与えるために使用されます。これを変更する場合は、OVER()
句内のORDER BY
を変更するだけです):
;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;