Použijte ROW_NUMBER()
. Nejprve přiřaďte každému záznamu číslo řádku:
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;
Pak můžete použít toto RowNumber
sloupec do PIVOT
vaše údaje:
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;
UPRAVIT
Pokud nerozumíte, neodpověděl jsem správně! Pevně věřím v přísloví "dej člověku rybu a nasytíš ho na jeden den; nauč člověka rybařit a nasytíš ho na celý život"
Pokud máte ve svých dvou tabulkách následující údaje:
Atributy '
AttributeId | Description
------------+---------------
1 | Bed
2 | Bath
3 | Beyond
ClientContactAttributes
ClientContactID | AttributeId
----------------+---------------
1 | 1
1 | 2
1 | 3
2 | 1
Spuštění následujícího:
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;
Dá vám:
ClientContactID | Description | RowNumber
----------------+-------------+-----------
1 | Bed | 1
1 | Bath | 2
1 | Beyond | 3
2 | Bed | 1
ROW_NUMBER()
funkce jednoduše přiřadí každé skupině jedinečné číslo (definované v PARTITION BY
klauzule) a toto číslo je určeno ORDER BY
doložka. takže tento řádek:
ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId ORDER BY a.AttributeId)
V podstatě říká, že pro každou jedinečnou hodnotu cca.ClientContactId
Chtěl bych jedinečné číslo začínající na 1, kde je nejnižší hodnota attributeId
obdrží 1 a odtamtud se číslo zvýší:
Funkce PIVOT je podobná kontingenční tabulce Excel, kde chcete převést řádky na sloupce. Má dvě základní části a zde budu pracovat zpětně. První část je FOR
klauzule:
FOR RowNumber IN ([1], [2], [3], [4])
Toto jsou hodnoty z RowNumber
sloupec, který chcete změnit na řádky. Názvy sloupců budou odpovídat zadaným hodnotám. Druhá část (první logicky čtení) definuje hodnoty, které budou vstupovat do těchto nově vytvořených sloupců. Musí to být agregační funkce a v tomto případě to je:
MAX(Description)
Protože už víte, že RowNumber
je jedinečný pro každé ClientContactId
, agregační funkce (která je vyžadována pro PIVOT`) ve skutečnosti nemá smysl, protože pro popis existuje pouze jedna hodnota, kterou lze agregovat.
Snad to dává trochu větší smysl.