在 SQL 中将行转置为列标题

Posted

技术标签:

【中文标题】在 SQL 中将行转置为列标题【英文标题】:Transposing Rows to Column Headings In SQL 【发布时间】:2019-07-02 08:18:42 【问题描述】:

我需要帮助将列中的某些行转置到下面的列标题是示例表 - 第一个是它现在的样子,第二个是我希望它被转置的方式。请需要帮助和想法。

尝试过 Pivot 代码但无法正常工作

Manager Director ManagerID  MetricName   Numerator Denominator
Name1    Name1    1112           Metric1    24  32
Name1    Name1    1112           Metric2    26  32
Name1    Name1    1112           Metric3    45  56
Name2    Name2    1245           Metric1    78  80
Name2    Name2    1245           Metric2    90  78
Name2    Name2    1245           Metric3    34  36

需要这种格式的

Manager Director ManagerID Metric1Numerator Metric1Denminator Metric3Num
Name1    Name1    1112      24            32        26
Name2    Name2    1245      78            90        90

【问题讨论】:

您的表格不清楚..这里的列标题是什么? 可以通过条件聚合来完成。如果MetricName 值列表不固定,请使用特定于 dbms 的动态 sql。请标记您的 dbms。 你检查过很多很多answers吗? 如果您尝试过,请edit 提出您的问题(点击下方的edit 链接)并向我们展示您尝试过的代码和错误您收到的消息(edit您的问题,请勿在 cmets 中发布代码) mysql pivot table的可能重复 【参考方案1】:

使用 PIVOT 和 UNPIVOT 将行转换为列,反之亦然。

试试这个:-

SELECT * FROM 
(SELECT manager, director, managerID,  metricname, numerator
FROM <your_table>) 
PIVOT (SUM(numerator) as nmt FOR (metricname) IN( 'Metric1', 'Metric2', 'Metric3')) 
ORDER BY manager;

【讨论】:

【参考方案2】:

您可以使用 SQL Server 中的 UNPIVOTPIVOT 函数来转置行和列,以下查询应该可以满足您的要求:

CREATE TABLE #temp (Manager VARCHAR(10),Director VARCHAR(10),ManagerID INT,MetricName VARCHAR(10),Numerator INT,Denominator INT)

INSERT INTO #temp VALUES
('Name1','Name1',1112,'Metric1',24,32),
('Name1','Name1',1112,'Metric2',26,32),
('Name1','Name1',1112,'Metric3',45,56),
('Name2','Name2',1245,'Metric1',78,80),
('Name2','Name2',1245,'Metric2',90,78),
('Name2','Name2',1245,'Metric3',34,36)

SELECT pvt.* 
FROM (
SELECT Manager
    ,Director
    ,ManagerID
    ,MetricName+Col AS [MetricName]
    ,Val 
FROM #temp
UNPIVOT (Val FOR Col IN([Numerator],[Denominator]))a )unpiv
PIVOT ( MAX(Val) FOR MetricName IN ([Metric1Numerator],[Metric1Denominator],[Metric2Numerator],[Metric2Denominator],[Metric3Numerator],[Metric3Denominator])) pvt

【讨论】:

以上是关于在 SQL 中将行转置为列标题的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中将行转置为列

SQL 将行转置为列

SQL Server JSON 将行转置为列

Oracle SQL Developer:如何使用 PIVOT 函数将行转置为列

SQL将行转置为列(按键变量分组)?

mysql 将行转置为列