在 TSQL 中透视多个列
使用关系数据库时,通常需要重新调整数据以用于报告目的。透视是一种可用于将数据从面向行的结构转换为面向列的结构的技术。本文演示了如何在保留所有关联标签的同时对表中的多个列进行透视。
挑战
考虑下面名为 GRAND_TOTALS 的表:
RATIO | RESULT | SCORE | GRADE |
---|---|---|---|
Current Ratio | 1.294 | 60 | Good |
Gearing Ratio | 0.3384 | 70 | Good |
Performance Ratio | 0.0427 | 50 | Satisfactory |
TOTAL | NULL | 180 | Good |
目标是对 RESULT、SCORE 和 GRADE 列进行透视,生成一个包含以下内容的表格式:
RATIO | Current Ratio | Gearing Ratio | Performance Ratio | TOTAL |
---|---|---|---|---|
Result | 1.294 | 0.3384 | 0.0427 | NULL |
Score | 60 | 70 | 50 | 180 |
Grade | Good | Good | Satisfactory | Good |
解决方案
要有效地旋转多个列,请考虑以下步骤:
取消旋转结果、分数和成绩列:
逆透视涉及将多个列转换为一个单列,同时跟踪原始列名称。这可以使用 UNPIVOT 子句来实现。下面的语法演示了如何对列进行逆透视:
select ratio, col, value from GRAND_TOTALS cross apply ( select 'result', cast(result as varchar(10)) union all select 'score', cast(score as varchar(10)) union all select 'grade', grade ) c(col, value)
此查询将创建一个包含 RATIO、COL 和 VALUE 列的新表,其中 COL 代表原始列名称(结果、分数或成绩) ) 并且 VALUE 包含相应的值。
应用 PIVOT功能:
数据取消透视后,可以应用 PIVOT 函数将数据转换为所需的格式。透视的语法如下:
select ratio = col, [current ratio], [gearing ratio], [performance ratio], total from ( select ratio, col, value from GRAND_TOTALS cross apply ( select 'result', cast(result as varchar(10)) union all select 'score', cast(score as varchar(10)) union all select 'grade', grade ) c(col, value) ) d pivot ( max(value) for ratio in ([current ratio], [gearing ratio], [performance ratio], total) ) piv;
在此查询中,PIVOT 函数按 RATIO 列对行进行分组,并使用 COL 值作为列标题来透视数据。 MAX 聚合函数用于检索每行的最新值。
结果
执行上述查询将生成所需的数据透视表:
RATIO | Current Ratio | Gearing Ratio | Performance Ratio | TOTAL |
---|---|---|---|---|
grade | Good | Good | Satisfactory | Good |
result | 1.29400 | 0.33840 | 0.04270 | NULL |
score | 60.00000 | 70.00000 | 50.00000 | 180.00000 |
该表保留所有必要的标签并成功旋转所需的标签专栏。
以上是如何在 T-SQL 中透视多个列以重塑数据以进行报告?的详细内容。更多信息请关注PHP中文网其他相关文章!