转置表,包括标题
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 玩转
【讨论】:
以上是关于转置表,包括标题的主要内容,如果未能解决你的问题,请参考以下文章