Gebruik ROW_NUMBER()
. Wijs eerst aan elk record een rijnummer toe:
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;
Dan kun je dit RowNumber
. gebruiken kolom naar PIVOT
uw gegevens:
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;
BEWERKEN
Als je het niet begrijpt, heb ik niet goed geantwoord! Ik geloof heilig in het spreekwoord "geef een man een vis en je voedt hem voor een dag; leer een man vissen en je voedt hem een leven lang"
Als u de volgende gegevens in uw twee tabellen heeft:
Kenmerken '
AttributeId | Description
------------+---------------
1 | Bed
2 | Bath
3 | Beyond
ClientContactAttributes
ClientContactID | AttributeId
----------------+---------------
1 | 1
1 | 2
1 | 3
2 | 1
Het volgende uitvoeren:
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;
Zal je geven:
ClientContactID | Description | RowNumber
----------------+-------------+-----------
1 | Bed | 1
1 | Bath | 2
1 | Beyond | 3
2 | Bed | 1
De ROW_NUMBER()
functie wijst eenvoudig een uniek nummer toe aan elke groep (gedefinieerd in de PARTITION BY
clausule), en dit aantal wordt bepaald door de ORDER BY
clausule. dus deze regel:
ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId ORDER BY a.AttributeId)
Zegt in wezen, voor elke unieke waarde van cca.ClientContactId
Ik wil graag een uniek nummer, beginnend bij 1, waarbij de laagste waarde van attributeId
ontvangt 1 en het nummer wordt vanaf daar verhoogd:
De PIVOT-functie lijkt veel op een Excel-draaitabel, waar u de rijen naar kolommen wilt converteren. Het heeft twee fundamentele delen en ik zal hier achteruit werken. Het eerste deel is de FOR
clausule:
FOR RowNumber IN ([1], [2], [3], [4])
Dit zijn de waarden van het RowNumber
kolom die u in rijen wilt veranderen. De kolomnamen komen overeen met de opgegeven waarden. Het tweede deel (eerste logische lezing) definieert de waarden die in deze nieuw aangemaakte kolommen zullen worden geplaatst. Dit moet een geaggregeerde functie zijn, en in dit geval is het:
MAX(Description)
Omdat je al weet dat RowNumber
is uniek voor elke ClientContactId
, de aggregatiefunctie (die vereist is voor PIVOT`) is eigenlijk zinloos, omdat er maar één waarde is voor de beschrijving om te aggregeren.
Hopelijk is dit een beetje logischer.