Gunakan ROW_NUMBER()
. Pertama-tama tetapkan setiap record sebuah nomor baris:
SELECT cca.ClientContactId,
a.Description,
RowNumber = ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId
ORDER BY a.AttributeId)
FROM ClientContactAttributes AS cca
INNER JOIN Attributes AS a
ON a.AttributeId = cca.AttributeId;
Kemudian Anda dapat menggunakan RowNumber
ini kolom ke PIVOT
data Anda:
WITH Data AS
( SELECT cca.ClientContactId,
a.Description,
RowNumber = ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId
ORDER BY a.AttributeId)
FROM ClientContactAttributes AS cca
INNER JOIN Attributes AS a
ON a.AttributeId = cca.AttributeId
)
SELECT pvt.ClientContactID,
Attribute1 = pvt.[1],
Attribute2 = pvt.[2],
Attribute3 = pvt.[3],
Attribute4 = pvt.[4]
FROM Data
PIVOT
( MAX(Description)
FOR RowNumber IN ([1], [2], [3], [4])
) AS pvt;
EDIT
Jika Anda tidak mengerti maka saya belum menjawab dengan benar! Saya sangat percaya pada pepatah "beri seseorang ikan dan Anda memberinya makan selama sehari; ajari seseorang memancing dan Anda memberinya makan seumur hidup"
Jika Anda memiliki data berikut dalam dua tabel Anda:
Atribut '
AttributeId | Description
------------+---------------
1 | Bed
2 | Bath
3 | Beyond
ClientContactAttributes
ClientContactID | AttributeId
----------------+---------------
1 | 1
1 | 2
1 | 3
2 | 1
Menjalankan yang berikut:
SELECT cca.ClientContactId,
a.Description,
RowNumber = ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId
ORDER BY a.AttributeId)
FROM ClientContactAttributes AS cca
INNER JOIN Attributes AS a
ON a.AttributeId = cca.AttributeId;
Akan memberi Anda:
ClientContactID | Description | RowNumber
----------------+-------------+-----------
1 | Bed | 1
1 | Bath | 2
1 | Beyond | 3
2 | Bed | 1
ROW_NUMBER()
fungsi hanya memberikan nomor unik untuk setiap grup (didefinisikan dalam PARTITION BY
klausa), dan nomor ini ditentukan oleh ORDER BY
ayat. jadi baris ini:
ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId ORDER BY a.AttributeId)
Pada dasarnya mengatakan, untuk setiap nilai unik cca.ClientContactId
Saya ingin nomor unik, mulai dari 1, di mana nilai terendah attributeId
menerima 1 dan angka bertambah dari sana:
Fungsi PIVOT, sangat mirip dengan tabel pivot excel, di mana Anda ingin mengubah baris menjadi kolom. Ini memiliki dua bagian mendasar, dan saya akan bekerja mundur di sini. Bagian pertama adalah FOR
klausa:
FOR RowNumber IN ([1], [2], [3], [4])
Ini adalah nilai dari RowNumber
kolom yang ingin Anda ubah menjadi baris. Nama kolom akan sesuai dengan nilai yang diberikan. Bagian kedua (pertama membaca secara logis), mendefinisikan nilai yang akan masuk ke kolom yang baru dibuat ini. Ini harus menjadi fungsi agregat, dan dalam hal ini adalah:
MAX(Description)
Karena Anda sudah tahu bahwa RowNumber
unik untuk setiap ClientContactId
, fungsi agregat (yang diperlukan untuk PIVOT`) sebenarnya tidak ada artinya, karena hanya ada satu nilai untuk deskripsi yang akan digabungkan.
Semoga ini sedikit lebih masuk akal.