SQL Server基于行值的Pivot/Case查询:薪资列转置需求
解决SQL Server中基于Metric列值的数据转置问题
假设样本表结构与数据
先明确你的Person表和Value表可能的结构(若与实际不符,可自行调整字段名):
Person表
| PersonID | Name |
|---|---|
| 1 | Bob |
| 2 | John |
| 3 | Alice |
Value表
| PersonID | Metric | Value |
|---|---|---|
| 1 | Salary | 50000 |
| 1 | Age | 30 |
| 2 | Salary | 60000 |
| 2 | Age | 35 |
| 3 | Age | 28 |
期望输出
| Name | Salary |
|---|---|
| Bob | 50000 |
| John | 60000 |
| Alice | NULL |
优化后的查询代码
使用条件聚合实现转置,这种方式比PIVOT更灵活,尤其适合仅提取单个Metric的场景:
SELECT p.Name, -- 筛选Metric为Salary的值,无匹配则返回NULL MAX(CASE WHEN v.Metric = 'Salary' THEN v.Value END) AS Salary FROM Person p -- 左连接确保所有Person都出现在结果中,若仅需保留有Salary记录的人,改为INNER JOIN即可 LEFT JOIN Value v ON p.PersonID = v.PersonID GROUP BY p.Name ORDER BY p.Name;
代码逻辑说明
CASE WHEN v.Metric = 'Salary' THEN v.Value END:仅当Metric列值为Salary时,取出对应的Value,其他情况返回NULLMAX()聚合函数:由于每个Person的Salary只会有一条记录,用MAX(或SUM/AVG均可)将同一Person的Salary值聚合到单行GROUP BY p.Name:保证每个Person仅生成一行结果LEFT JOIN:保留所有Person条目,即使无Salary记录(此时Salary列显示NULL)
额外适配说明
若Value列是字符串类型,需转换为数值类型的话,可修改CASE语句:
MAX(CASE WHEN v.Metric = 'Salary' THEN CAST(v.Value AS DECIMAL(18,2)) END) AS Salary
内容的提问来源于stack exchange,提问作者KL_
相关产品推荐
相关产品推荐

