2015-02-17 2 views
0

Текущие результаты:SQL Server 2008 Ранг с шарниром

ID Keyid  PersonID  Rank 
------------------------------------ 
1  4678   9   1 
1  4678   8   2 
23 1234   7   1 
2  4321   6   1 
2  4321   5   2 

Результаты Я хотел бы видеть

ID Keyid  Rank1  Rank2 
------------------------------------ 
1  4678  9   8 
23 1234  7   blank 
2  4321  6   5 

текущий запрос:

SELECT top 1000 
    nm.ID, 
    aj.KEYID, 
    nm.PERSONID, 
    RANK() OVER(PARTITION BY nm.ID, aj.PERSONID ORDER BY nm.ID, aj.KEYID, nm.ID) as [Rank] 
FROM 
    nm WITH(NOLOCK) 
JOIN 
    aj WITH(NOLOCK) ON aj.KEYID = nm.KEYID 
WHERE 
    ID IS NOT NULL and ID <> '' AND ID <> 0 
GROUP BY 
    nm.ID, nm.PERSONID, aj.KEYID 

Я попытался решение поворота, но не может быть успешным. Любая помощь будет оценена, имейте в виду, что есть строки строк для отображения ...

+0

Попытка создать подзапрос для получения желаемых результатов. –

+0

У вас будет только 2 ранга на человека? – Taryn

+0

Нет, я мог бы иметь более 2 рангов на человека. –

ответ

0

Вы можете получить желаемый результат несколькими различными способами. Вы можете использовать агрегатную функцию вместе с некоторой условной логикой или вы можете использовать функцию 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 |