如何围绕特定行值重组SQL查询,实现指定结果展示格式?
解决方案
一、SQL层面预处理成目标格式
普通PIVOT默认会用聚合函数(如MAX/MIN)合并数据,导致丢失多行记录。要保留每个员工的所有EstimatedWeight,需先给每个员工的记录添加行序号,再基于行序号做PIVOT。
以SQL Server为例,代码如下:
-- 先给每个员工的记录生成专属行号 WITH RankedData AS ( SELECT EmployeeCode, EstimatedWeight, -- 按员工代码分区,为每条记录编序号 ROW_NUMBER() OVER (PARTITION BY EmployeeCode ORDER BY (SELECT NULL)) AS RowNum FROM YourTableName ) -- 基于行号执行列转行 SELECT [A], [B], [C] FROM RankedData PIVOT ( MAX(EstimatedWeight) -- 此处用MAX仅为满足PIVOT的聚合要求,同一行号+员工代码仅对应一条数据 FOR EmployeeCode IN ([A], [B], [C]) ) AS PivotedTable ORDER BY RowNum;
说明:ORDER BY (SELECT NULL)可替换为实际需要的排序逻辑(如按EstimatedWeight排序),确保行顺序符合预期。若员工代码不固定,可改用动态SQL自动生成PIVOT的列列表。
二、RDL报表(Matrix控件)直接实现
如果不想修改SQL,可直接在报表中配置Matrix控件:
- 在数据集查询中添加行序号(逻辑同上述SQL的
RankedData部分),或在报表数据集的字段中新增计算字段生成行号。 - 拖拽Matrix控件到报表设计界面:
- 行组:设置为新增的
RowNum字段(不要设置聚合) - 列组:设置为
EmployeeCode字段(不要设置聚合) - 数据区域:拖入
EstimatedWeight字段,聚合方式选择First(同一行号+员工代码仅对应一条数据,First/Max/Min结果一致)
- 行组:设置为新增的
- 调整列头显示为员工代码(默认自动匹配),删除行组的
RowNum列(无需显示序号)。
运行报表后即可得到目标格式的表格。
内容的提问来源于stack exchange,提问作者ALArchipelago
相关产品推荐
相关产品推荐

