Агрегатная функция вместе с unpivot

#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;