转置表,包括标题

Posted

技术标签:

【中文标题】转置表,包括标题【英文标题】:Transpose table including headers 【发布时间】:2020-06-22 13:06:51 【问题描述】:

我有一个要转置的查询,包括标题。下面的缩减示例:

SELECT 'Records' AS [Entity], COUNT([ContactID]) AS [ContactID],
        COUNT([FirstName]) AS [FirstName],
        COUNT([LastName]) AS [LastName],COUNT([Title]) AS [Title] 
FROM [all].[Account]

这是我在 Excel 中创建的一个示例,用于演示所需的结果:

【问题讨论】:

【参考方案1】:

如果您的数据库支持横向连接和values() 行构造函数,您可以按如下方式取消透视和聚合:

select x.entity, count(x.val) records
from account a
cross apply (values ('contactid', a.contactid), ('firstname', a.firstname), ('last_name', a.lastname)) as x(entity, val)
group by x.entity

一些数据库使用cross join lateral 而不是cross apply

更便携的方法(虽然效率较低)是union all

select 'contactid' entity, count(contactid) from account
union all
select 'firstname', count(firstname) from account 
union all
select 'lastname', count(lastname) from account

【讨论】:

感谢您的回复,这与我的要求非常接近,并且肯定比我最初拥有的与您的第二个建议相似的更有效。 欢迎@JSheldrake。如果我的回答正确回答了您的问题,请点击复选标志accept it。【参考方案2】:

一般来说(ANSI SQL),这个任务并不简单。它取决于初始表/查询中的列数和值。以前使用 UNION ALL 的响应很好地解决了您的任务。

但只要你有 SQL server RDBMS,就有一个 PIVOT/UNVPIVOT 可以转置几乎每个表/查询:

-- suppose you have a table 
CREATE TABLE Account ([ContactID] varchar(10), [FirstName] varchar(10)
, [LastName] varchar(10),[Title] varchar(10));

INSERT INTO Account VALUES 
('Aaa', 'Bbb', 'Ccc','Ddd'), ('Eee', 'Fff', 'Ggg','Hhh')
, ('Qqq', 'Www', 'Rrr','Ttt'),  ('Zzz', 'Xxx', 'Vvv','Nnn')
, ('Mmm', 'Sss', 'Uuu','Ooo');

结果是

SELECT * FROM 
( SELECT 'Records' AS [EntityN], columnName as [Entity], columnValue
FROM [Account]
UNPIVOT
(
  columnValue
  FOR columnName IN (ContactID,FirstName, LastName, Title)
) unpivotQuery
) q
PIVOT
(
 COUNT(columnValue)
 FOR EntityN in (Records)
) pivotQuery;

查看SQL Fiddle 玩转

【讨论】:

以上是关于转置表,包括标题的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL中的转置表

使用幂查询转置表

SQL转置表 - sqlserver [重复]

使用转置表进行 Alpha-beta 修剪,迭代加深

python zip()函数转置表,操作列

具有分析功能的oracle转置[重复]