在 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 中的 UNPIVOT
和 PIVOT
函数来转置行和列,以下查询应该可以满足您的要求:
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 中将行转置为列标题的主要内容,如果未能解决你的问题,请参考以下文章