在SQL中将行转换为列标题

时间:2019-07-02 08:18:42

标签: sql pivot transpose

在将列中的某些行转换为列标题时,我需要帮助,下面是示例表-第一个是现在的外观,第二个是我希望如何对其进行转换。请需要帮助和想法。

尝试了数据透视代码但不起作用

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

2 个答案:

答案 0 :(得分:0)

使用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;

答案 1 :(得分:0)

您可以在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