转置表,包括标题

0s0u357o  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(221)

第一次海报长期潜伏,只是无法得到我的头在这一个。。。
基本上我有一个查询,我想转置包括标题。下例:

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

下面是我在excel中创建的一个示例,以演示所需的结果。

任何帮助都将不胜感激
干杯
杰森

8ljdwjyq

8ljdwjyq1#

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

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
flvtvl50

flvtvl502#

一般来说(ansisql),这项任务并不简单。它取决于初始表/查询中的列数和值数。以前对联合的回应都很好地解决了你的任务。
但是,只要您有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小提琴演奏

相关问题