【问题标题】:I'm converting column headers in row in my database view having many fields我正在我的数据库视图中转换行中的列标题,其中包含许多字段
【发布时间】:2025-12-04 19:15:01
【问题描述】:

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

【问题讨论】:

  • 在谷歌上搜索数据透视表
  • Pivot 似乎是正确的方法。你能告诉我们你到目前为止所做的尝试吗?
  • 听起来你需要 unpivot。
  • 您使用的是哪个 DBMS?甲骨文?后格雷斯? DB2?

标签: sql database pivot


【解决方案1】:

sample took from 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

【讨论】:

    【解决方案2】:

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

    假设您有以下示例数据:

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

    如果您使用的是支持 UNPIVOT 功能的数据库,查询的语法将类似于:

    select id, name, col, value
    from yourtable
    unpivot
    (
        value
        for col in (class1, class2, class3, class4)
    ) unpiv
    

    【讨论】: