Да, вы можете сделать это с помощью PIVOT
, но не в этой форме, вы должны сначала создать номер строки, чтобы использовать ее для форматирования данных так, как вы хотите. Что-то вроде этого:
WITH Ranked
AS
(
SELECT GroupName, IDnumber,
ROW_NUMBER() OVER(PARTITION BY GroupName ORDER BY GroupName) AS RN
FROM Table1
)
SELECT GroupName,
[1] AS ID1, [2] AS ID2, [3] AS ID3, [4] AS ID4
FROM Ranked AS r
PIVOT
(
MAX(IDnumber)
FOR RN IN([1], [2], [3], [4])
) AS p;
Это даст вам:
| GROUPNAME | ID1 | ID2 | ID3 | ID4 |
|-----------|------|------|------|--------|
| 1 | 8395 | A660 | 8396 | A661 |
| 2 | 8398 | A662 | 8399 | (null) |
Если вы хотите сделать это динамически, а не писать номер строки по вручную в операторе таблицы pivot
, вам нужно сделать это с помощью динамического SQL, somethi нг как:
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @colnames AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
SELECT @cols = STUFF((SELECT distinct ',' +
QUOTENAME(RN)
FROM
(
SELECT ROW_NUMBER() OVER(PARTITION BY GroupName ORDER BY GroupName) AS RN
FROM Table1
) AS t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '');
SELECT @colnames = STUFF((SELECT distinct ',' +
QUOTENAME(RN) + 'AS' +
QUOTENAME('ID' + CAST(RN AS NVARCHAR(5)))
FROM
(
SELECT ROW_NUMBER() OVER(PARTITION BY GroupName ORDER BY GroupName) AS RN
FROM Table1
) AS t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '');
SELECT @query = 'WITH Ranked
AS
(
SELECT GroupName, IDnumber,
ROW_NUMBER() OVER(PARTITION BY GroupName ORDER BY GroupName) AS RN
FROM Table1
)
SELECT GroupName, ' + @colnames +
' FROM Ranked AS r
PIVOT
(
MAX(IDnumber)
FOR RN IN(' + @cols + ')' +
') p';
execute(@query);
Это должно дать вам тот же результат:
| GROUPNAME | ID1 | ID2 | ID3 | ID4 |
|-----------|------|------|------|--------|
| 1 | 8395 | A660 | 8396 | A661 |
| 2 | 8398 | A662 | 8399 | (null) |
Хорошо, это работает фантастически! Он делает именно то, что я хочу сделать. Но я не могу его спасти. Когда я пытаюсь сохранить нединамическую версию в качестве представления, поэтому я могу повторно использовать ее для своего приложения, она отсекает первые три строки. Не могу понять, почему. Если я попытаюсь сохранить динамическую версию, это говорит о наличии проблемы с оператором DECLARE и не позволит мне ее сохранить. Спасибо за помощь. – Jeff
@Jeff - Вы не можете использовать его в представлении. Вы можете сделать это в хранимой процедуре. Он должен работать нормально. –
Хорошо, я понял это и работал в своем приложении. Спасибо! – Jeff