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;
編集
わからないならちゃんと答えていない!私は、ことわざ 「人に魚を与えれば、その人を 1 日養うことができます。人に魚の釣り方を教えれば、その人を一生養うことができます」 を固く信じています。
2 つのテーブルに次のデータがある場合:
属性 '
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
の一意の値ごとに本質的に言っています attributeId
の最小値が 1 から始まる一意の番号が必要です 1 を受け取り、そこから数が増えます:
PIVOT 関数は、行を列に変換する Excel のピボット テーブルによく似ています。これには 2 つの基本的な部分があり、ここでは逆方向に作業します。最初の部分は FOR
です 節:
FOR RowNumber IN ([1], [2], [3], [4])
これは RowNumber
の値です 行に変換する列。列名は、指定された値に対応します。 2 番目の部分 (最初の論理読み取り) では、これらの新しく作成された列に入る値を定義します。これは集約関数である必要があり、この場合は次のようになります:
MAX(Description)
RowNumber
はすでに知っているので、 ClientContactId
ごとに一意です 、集計関数 (PIVOT` に必要) は実際には意味がありません。集計する説明の値が 1 つしかないためです。
うまくいけば、これがもう少し理にかなっています.