Вы можете получить желаемый результат несколькими различными способами. Вы можете использовать агрегатную функцию вместе с некоторой условной логикой или вы можете использовать функцию PIVOT.
Агрегатная функция с условной логикой, как выражение CASE, будет:
select id, keyid,
Rank1 = max(case when [rank] = 1 then personid end),
Rank2 = max(case when [rank] = 2 then personid end)
from
(
--- replace with your current query
select id, keyid, personid,
[rank]
from yourquery
) d
group by id, keyid;
См SQL Fiddle with Demo
Использование функции PIVOT:
select id, keyid, rank1, rank2
from
(
--- replace with your current query
select id, keyid, personid,
[rank] = 'Rank'+cast([rank] as varchar(2))
from yourquery
) d
pivot
(
max(personid)
for [rank] in (Rank1, Rank2)
) piv;
См SQL Fiddle with Demo
Теперь вам прокомментировали, что вы ave неизвестное количество значений rank
. В этом случае вам нужно будет использовать динамический sql для получения списка всех рангов для преобразования в столбцы. Код будет следующим:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME('Rank'+cast([rank] as varchar(2)))
from
(
select [rank]
from yourquery
) d
group by [rank]
order by [rank]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT id, keyid,' + @cols + '
from
(
--- replace with your current query
select id, keyid, personid,
[rank] = ''Rank''+cast([rank] as varchar(2))
from yourquery
) x
pivot
(
max(personid)
for [rank] in (' + @cols + ')
) p '
exec sp_executesql @query;
См. SQL Fiddle with Demo. Вы замените подзапрос, используемый здесь, на ваш текущий запрос, и все это даст результат:
| ID | KEYID | RANK1 | RANK2 |
|----|-------|-------|--------|
| 23 | 1234 | 7 | (null) |
| 2 | 4321 | 6 | 5 |
| 1 | 4678 | 9 | 8 |
Попытка создать подзапрос для получения желаемых результатов. –
У вас будет только 2 ранга на человека? – Taryn
Нет, я мог бы иметь более 2 рангов на человека. –