#sql #sql-server #pivot #aggregate #unpivot
#sql #sql-сервер #сводная #агрегировать #unpivot
Вопрос:
Я использую функцию unpivot, которая выполняется против временной таблицы, и она дает результат, как показано ниже.
Select User, Grade, Experience FROM @TempTable
unpivot
(
[Experience] For [Grade] IN ([L1],[L2],[L3],[L4])
) unpiv;
Вывод
[User] [Grade] [Experience]
1 L1 2
1 L2 3
1 L3 1
1 L4 0
2 L1 1
2 L2 2
2 L3 0
2 L4 0
Помимо столбца опыта я также хотел бы иметь столбец процентов, который должен быть сгруппирован по пользователям. Например, если мы рассмотрим пользователя 1, для оценки L1 это будет 2/6 * 100, а для L2 это будет 3/6 * 100
Любые предложения о том, как этого добиться?
Это будет похоже на Experience / Sum (Опыт) * 100, но СУММА должна быть сгруппирована по пользователю.
Комментарии:
1. Примеры данных и ожидаемые результаты помогут нам помочь вам. Скорее всего, вам будет проще построить
VALUES
таблицу вместо более строгогоUNPIVOT
оператора.2.
Experience / sum(Experience) over(partition by user rows between unbounded preceding and unbounded following)
?3. @GSerg Я не понял, как можно применить where и group by [Опыт] / SUM([Опыт]) БОЛЕЕ (РАЗДЕЛЕНИЕ ПО [Опыту]) * 100
Ответ №1:
declare @TempTable table ([User] int, L1 int, L2 int, L3 int, L4 int);
insert into @TempTable([User], L1, L2, L3, L4)
values(1, 2, 3, 1, 0), (2, 1, 2, 0, 0);
Select [User], Grade, Experience, (Experience*100.0)/SUM(Experience) OVER(PARTITION BY [User])
FROM @TempTable
unpivot
(
[Experience] For [Grade] IN ([L1],[L2],[L3],[L4])
) unpiv;