Użyj ROW_NUMBER()
. Najpierw przypisz każdemu rekordowi numer wiersza:
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;
Następnie możesz użyć tego RowNumber
kolumna do PIVOT
Twoje dane:
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;
EDYTUJ
Jeśli nie rozumiesz, to nie odpowiedziałem poprawnie! Mocno wierzę w przysłowie „daj człowiekowi rybę, a nakarmisz go przez jeden dzień; naucz człowieka łowić ryby, a nakarmisz go przez całe życie”
Jeśli masz następujące dane w swoich dwóch tabelach:
Atrybuty '
AttributeId | Description
------------+---------------
1 | Bed
2 | Bath
3 | Beyond
Atrybuty kontaktu z klientem
ClientContactID | AttributeId
----------------+---------------
1 | 1
1 | 2
1 | 3
2 | 1
Uruchamianie następujących czynności:
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;
Da ci:
ClientContactID | Description | RowNumber
----------------+-------------+-----------
1 | Bed | 1
1 | Bath | 2
1 | Beyond | 3
2 | Bed | 1
ROW_NUMBER()
funkcja po prostu przypisuje unikalny numer do każdej grupy (zdefiniowanej w PARTITION BY
klauzula), a liczba ta jest określona przez ORDER BY
klauzula. więc ta linia:
ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId ORDER BY a.AttributeId)
Zasadniczo mówi, że dla każdej unikalnej wartości cca.ClientContactId
Chciałbym uzyskać unikalny numer, zaczynając od 1, gdzie najniższa wartość attributeId
otrzymuje 1, a stamtąd liczba wzrasta:
Funkcja PRZESTAWNA przypomina tabelę przestawną programu Excel, w której chcesz przekonwertować wiersze na kolumny. Składa się z dwóch zasadniczych części i tutaj będę pracował wstecz. Pierwsza część to FOR
klauzula:
FOR RowNumber IN ([1], [2], [3], [4])
To są wartości z RowNumber
kolumna, którą chcesz zamienić w wiersze. Nazwy kolumn będą odpowiadać podanym wartościom. Druga część (pierwsza logicznie czytana) definiuje wartości, które trafią do tych nowo utworzonych kolumn. Musi to być funkcja agregująca, w tym przypadku jest to:
MAX(Description)
Skoro już wiesz, że RowNumber
jest unikalny dla każdego ClientContactId
, funkcja agregująca (która jest wymagana dla PIVOT`) jest właściwie bez znaczenia, ponieważ istnieje tylko jedna wartość do agregowania opisu.
Mam nadzieję, że ma to trochę więcej sensu.