2015-01-24 2 views
0

У меня есть производная таблица, которая имеет достижения в одном столбце, идентификатор personID в следующем столбце и уровень достижения. В следующем столбце. Моя цель - создать таблицу, которая имеет отличные достижения в дальнем левом столбце, а следующие пять столбцов - это количество людей, у которых это Достижение является их наивысшим ранжированием, вторым по высоте, третьим по высоте и т. Д. Достижением. Таким образом, человек с 2-го ранга, как их наивысшего рейтинга достижений, и 12 в качестве второго высокий рейтинг достижений, будет учитываться в первом столбце для Achiev2, а второй столбец для Achiev12T-SQL 2008 Выберите первую вторую и третью строку группы

Звания в диапазоне от 1 до бесконечности. Ранг 1 - самый высокий ранг.

Пример Источник Таблица

Achievement | PersonID | Rank 
------------------------------ 
Achiev1  |  1 | 1 
Achiev2  |  3 | 2 
AChiev2  |  1 | 2 
Achiev1  |  2 | 1 

Ожидаемый результат

Achievement | #OfPeopleHighestAchiev | #OfPeopleSecondHighestAchiev | etc. 
-------------------------------------------------------------------- 
Achiev1  |   2   |    0 
Achiev2  |   1   |    1 

Я не уверен, как это сделать, и любое направление, где для начала было бы весьма признателен!

+0

Основываясь на данных и описанной логике, я ожидал бы, что строки будут: «1, 1» и «0, 2». –

+0

В этой заботе Лицо 1 и Лицо 2 имеют Achiev1 в качестве своего наивысшего достижения. Нет ни одного человека, достигшего 1, своего второго достижения в рейтинге, потому что это достижение самого высокого ранга. У человека 3 есть Achiev2 как их достижение высшего ранга, а у человека 1 есть Достижение 2 как второе достижение с самым высоким рейтингом. – ChadJPetersen

ответ

1

здесь один из возможных вариантов:

select 
    Achievement, 
    sum(case when RankNum = 1 then 1 else 0 end) as HighRank1, 
    sum(case when RankNum = 2 then 1 else 0 end) as HighRank2, 
    ... 
from (
    select 
     PersonId, 
     Achievement, 
     row_number() over(
      partition by PersonId order by Rank) as RankNum 
    from sourcetable 
) as t 
group by Achievement 

основная идея заключается в том, чтобы присвоить номер каждое достижение для каждого человека, это делается через (раздел ..

проверка скрипки http://sqlfiddle.com/#!3/d8f0f/8

+0

Возможно, вы захотите добавить объяснение происходящего. Простое предоставление решения для перехода не обязательно полезно для процесса обучения. –

+0

@dubstylee Я предполагаю, что этот конкретный код не требует пояснений, а любые комментарии бесполезны, иначе мне нужно скопировать-вставить код ansi sql здесь –

+0

Это будет хорошо работать, если в первом столбце всегда был ранг 1, но здесь проблема Я не могу закончить. И это первый столбец будет самым высоким ранга, которого достиг человек. а не установленное число. (ЭГ. Достижение 1 всегда имеет достижение 1-го ранга 2 всегда имеет ранг 2, столбец один - это сумма людей, которые добились этого достижения в качестве своего достижения высшего ранга – ChadJPetersen

0

Вы можете просто использовать условную aggegation:

select achievement, 
     sum(case when rank = 1 then 1 else 0 end) as rank1, 
     sum(case when rank = 2 then 1 else 0 end) as rank2, 
     sum(case when rank = 3 then 1 else 0 end) as rank3, 
     sum(case when rank = 4 then 1 else 0 end) as rank4, 
     sum(case when rank = 5 then 1 else 0 end) as rank5 
from source 
group by achievement; 

Примечание: это, похоже, удовлетворяет цели вопроса. Однако результаты выборки, по-видимому, следуют логике, отличной от описанной.

Смежные вопросы