sql - TSQL 透视多个列

标签 sql sql-server tsql pivot

我有下表,但不确定是否可以旋转该表并保留所有标签。

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

我承认我不太擅长使用枢轴,因此经过多次尝试后得到了以下输出:

SELECT 'RESULT' AS 'Ratio'
  ,[Current Ratio] AS 'Current Ratio'
  ,[Gearing Ratio] AS 'Gearing Ratio'
  ,[Performance Ratio] AS 'Performance Ratio'
  ,[TOTAL] AS 'TOTAL'
FROM
(
  SELECT RATIO, RESULT 
  FROM GRAND_TOTALS
) AS SREC
PIVOT 
(
  MAX(RESULT) 
  FOR RATIO IN ([Current Ratio],[Gearing Ratio], [Performance Ratio], [TOTAL])
) AS PVT

这给出了结果:

Ratio    Current Ratio   Gearing Ratio   Performance Ratio
Result   1.294           0.3384          0.0427

我承认我对接下来要做什么来产生我需要的结果感到非常困惑,即:

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

最佳答案

由于您想要旋转多列数据,我首先建议取消旋转结果分数成绩列,这样您就不会'不会有多列,但会有多行。

根据您的 SQL Server 版本,您可以使用 UNPIVOT 函数或 CROSS APPLY。取消数据透视的语法类似于:

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)

参见SQL Fiddle with Demo 。一旦数据被取消透视,您就可以应用 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;

参见SQL Fiddle with Demo 。这会给你结果:

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

关于sql - TSQL 透视多个列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19590799/

相关文章:

mysql - 中等 MySQL 表(100 万行)的慢查询

php - Mysql DELETE 查询在 PMA 中有效,但在我的 PHP 脚本中无效

mysql - DateDiff 不起作用

mysql - 使用将表连接到自身并连接另一个表

php - SQL 语句/php 代码来处理一本书的许多作者

sql-server - INSERT INTO SELECT 使用 UNION 的奇怪顺序

c# - LINQ 到 SQL : Stored Procedure Results

sql-server - SQL Server 繁琐的回调

sql - 使用 CHECK ADD CONSTRAINT 后接 CHECK CONSTRAINT 与 ADD CONSTRAINT

sql-server - 使用sql中的批量插入将文本文件的行号存储在表中