聚合函数和 unpivot

Posted

技术标签:

【中文标题】聚合函数和 unpivot【英文标题】:Aggregate function along with unpivot 【发布时间】:2020-12-03 08:59:11 【问题描述】:

我正在使用在临时表上执行的 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(Experience) * 100,但 SUM 应按用户分组。

【问题讨论】:

样本数据和预期结果将帮助我们帮助您。与限制性更强的 UNPIVOT 运算符相比,VALUES 表结构很可能会让您更轻松。 Experience / sum(Experience) over(partition by user rows between unbounded preceding and unbounded following)? @GSerg 我不知道如何应用 where 和 group by [Experience]/SUM([Experience]) OVER (PARTITION BY [Experience])* 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;

【讨论】:

以上是关于聚合函数和 unpivot的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server中行列转换 Pivot UnPivot

在没有任何聚合函数的情况下将列数据转换为行

T-Sql语法:行转列(pivot)和列转行(unpivot)

使用 PIVOT 和 UNPIVOT实现查询结果行转列

SqlServer基本操作

PIVOT、UNPIVOT 转换行与列