【问题标题】: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 中创建的一个示例,用于演示所需的结果:

【问题讨论】:

    标签: sql sql-server select unpivot


    【解决方案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 玩转

    【讨论】:

      猜你喜欢
      • 2013-04-19
      • 1970-01-01
      • 2011-10-19
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多