Brug ROW_NUMBER()
. Tildel først hver post et rækkenummer:
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;
Så kan du bruge dette RowNumber
kolonne til PIVOT
dine data:
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;
REDIGER
Hvis du ikke forstår, så har jeg ikke svaret ordentligt! Jeg tror fuldt og fast på ordsproget "giv en mand en fisk, og du fodrer ham for en dag; lær en mand at fiske, og du fodrer ham for hele livet"
Hvis du har følgende data i dine to tabeller:
Attributter '
AttributeId | Description
------------+---------------
1 | Bed
2 | Bath
3 | Beyond
ClientContactAttributes
ClientContactID | AttributeId
----------------+---------------
1 | 1
1 | 2
1 | 3
2 | 1
Kører følgende:
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;
Vil give dig:
ClientContactID | Description | RowNumber
----------------+-------------+-----------
1 | Bed | 1
1 | Bath | 2
1 | Beyond | 3
2 | Bed | 1
ROW_NUMBER()
funktionen tildeler simpelthen et unikt nummer til hver gruppe (defineret i PARTITION BY
klausul), og dette nummer bestemmes af ORDER BY
klausul. så denne linje:
ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId ORDER BY a.AttributeId)
Siger i bund og grund for hver unik værdi af cca.ClientContactId
Jeg vil gerne have et unikt nummer, der starter ved 1, hvor den laveste værdi af attributeId
modtager 1 og antallet stiger derfra:
PIVOT-funktionen er meget som en excel-pivottabel, hvor du vil konvertere rækkerne til kolonner. Det har to grundlæggende dele, og jeg vil arbejde baglæns her. Den første del er FOR
klausul:
FOR RowNumber IN ([1], [2], [3], [4])
Dette er værdierne fra RowNumber
kolonne, som du vil lave om til rækker. Kolonnenavnene svarer til de angivne værdier. Den anden del (første logisk læsning), definerer de værdier, der vil gå ind i disse nyoprettede kolonner. Dette skal være en aggregeret funktion, og i dette tilfælde er det:
MAX(Description)
Da du allerede kender det RowNumber
er unik for hver ClientContactId
, er aggregeringsfunktionen (som er påkrævet for PIVOT`) faktisk meningsløs, da der kun er én værdi for beskrivelse at aggregere.
Forhåbentlig giver det lidt mere mening.