Използвайте ROW_NUMBER()
. Първо присвоете на всеки запис номер на ред:
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;
След това можете да използвате този RowNumber
колона към PIVOT
вашите данни:
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;
РЕДАКТИРАНЕ
Ако не разбирате, значи не съм отговорил правилно! Твърдо вярвам в поговорката "дай на човек риба и ще го нахраниш за един ден; научи го да лови риба и ще го нахраниш за цял живот"
Ако имате следните данни в двете си таблици:
Атрибути '
AttributeId | Description
------------+---------------
1 | Bed
2 | Bath
3 | Beyond
ClientContactAttributes
ClientContactID | AttributeId
----------------+---------------
1 | 1
1 | 2
1 | 3
2 | 1
Изпълнение на следното:
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;
Ще ви даде:
ClientContactID | Description | RowNumber
----------------+-------------+-----------
1 | Bed | 1
1 | Bath | 2
1 | Beyond | 3
2 | Bed | 1
ROW_NUMBER()
функцията просто присвоява уникален номер на всяка група (дефинирана в PARTITION BY
клауза) и този номер се определя от ORDER BY
клауза. така че този ред:
ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId ORDER BY a.AttributeId)
По същество се казва, за всяка уникална стойност на cca.ClientContactId
Бих искал уникален номер, започващ от 1, където е най-ниската стойност на attributeId
получава 1 и числото се увеличава оттам:
Функцията PIVOT е много подобна на обобщена таблица на Excel, където искате да конвертирате редовете в колони. Има две основни части и тук ще работя отзад напред. Първата част е FOR
клауза:
FOR RowNumber IN ([1], [2], [3], [4])
Това са стойностите от RowNumber
колона, която искате да превърнете в редове. Имената на колоните ще съответстват на предоставените стойности. Втората част (първото логическо четене) дефинира стойностите, които ще влязат в тези новосъздадени колони. Това трябва да е агрегатна функция и в този случай е:
MAX(Description)
Тъй като вече знаете, че RowNumber
е уникален за всеки ClientContactId
, обобщителната функция (която е необходима за PIVOT`) всъщност е безсмислена, тъй като има само една стойност за описание за агрегиране.
Надяваме се, че това има малко повече смисъл.