0

我希望将我的列标题转换为行,并在它们前面显示数据。如果有人知道,请提供帮助。我尝试了旋转,但没有找到太多帮助。

4

2 回答 2

0

听起来您需要取消数据透视。反透视的过程将多列转换为多行。您没有指定您使用的数据库,所以我将提供一些解决方案。

假设您有以下示例数据:

create table yourtable
(
  id int,
  name varchar(50),
  class1 varchar(50),
  class2 varchar(50),
  class3 varchar(50),
  class4 varchar(50)
);

insert into yourtable
values 
  (1, 'John', 'Science', 'Math', 'Chem', 'Physics'),
  (2, 'Bob', 'Math', 'SS', 'Bio', 'Chem'),
  (3, 'Jim', 'Econ', 'Math', 'Bio', 'Sci'),
  (4, 'Sally', 'Crim', 'Bio', 'Math', 'Chem');

如果您的数据库没有像 SQL Server、Oracle 这样的 UNPIVOT 函数,那么您可以使用 UNION ALL 查询来获取结果:

select id, name, 'class1' col, class1 value
from yourtable 
union all
select id, name, 'class2' col, class2 value
from yourtable 
union all
select id, name, 'class3' col, class3 value
from yourtable 
union all
select id, name, 'class4' col, class4 value
from yourtable;

请参阅带有演示的 SQL Fiddle

如果您使用的数据库支持 UNPIVOT 函数,则查询的语法类似于:

select id, name, col, value
from yourtable
unpivot
(
    value
    for col in (class1, class2, class3, class4)
) unpiv
于 2013-09-06T11:11:32.483 回答
0

样本取自 http://technet.microsoft.com/

USE AdventureWorks2008R2 ;
GO
SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost 
FROM Production.Product
GROUP BY DaysToManufacture;

这是结果集。

DaysToManufacture          AverageCost
0                          5.0885
1                          223.88
2                          359.1082
4                          949.4105

没有产品定义为 3 DaysToManufacture。下面的代码显示了相同的结果,经过透视后,DaysToManufacture 值成为列标题。列提供了三 [3] 天,即使结果为 NULL。

-- Pivot table with one row and five columns
SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, 
[0], [1], [2], [3], [4]
FROM
(SELECT DaysToManufacture, StandardCost 
    FROM Production.Product) AS SourceTable
PIVOT
(
AVG(StandardCost)
FOR DaysToManufacture IN ([0], [1], [2], [3], [4])
) AS PivotTable;

这是结果集。

Cost_Sorted_By_Production_Days    0         1         2           3       4       
AverageCost                       5.0885    223.88    359.1082    NULL    949.4105
于 2013-09-06T10:15:37.277 回答