如何在 Transact/SQL 中创建数据透视表?

Posted

技术标签:

【中文标题】如何在 Transact/SQL 中创建数据透视表?【英文标题】:How to create a PivotTable in Transact/SQL? 【发布时间】:2012-07-21 23:52:24 【问题描述】:

我的源数据表是

MemID Condition_ID Condtion_Result
----------------------------------
1     C1           0
1     C2           0
1     C3           0
1     C4           1
2     C1           0
2     C2           0
2     C3           0
2     C4           0

我想要创建的预期视图是 ....

MemID C1 C2 C3 C4
------------------
1     1  0  0  1
2     0  0  0  1

这是另一个条件。 在上面的源表示例中,给定的 MemID 只有 4 行。这个数字会因实际情况而异。我的数据透视表(或任何其他解决方案)应该选择任意数量的条件结果并将它们显示为列。 怎么办?

【问题讨论】:

【参考方案1】:

您需要使用PIVOT。您可以使用知道要转换的列的值的 STATIC PIVOT,也可以使用直到执行时才知道列的 DYNAMIC PIVOT。

静态枢轴(参见SQL Fiddle with Demo):

select *
from 
(
    select memid, Condition_id, Condition_Result
    from t
) x
pivot
(
    sum(condition_result)
    for condition_id in ([C1], [C2], [C3], [C4])
) p

动态枢轴(参见SQL Fiddle with Demo):

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.condition_id) 
            FROM t c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT memid, ' + @cols + ' from 
            (
                select MemId, Condition_id, condition_result
                from t
           ) x
            pivot 
            (
                sum(condition_result)
                for condition_id in (' + @cols + ')
            ) p '


execute(@query)

两者都会产生相同的结果。

【讨论】:

在这个查询(执行(@query))结果上,我想运行我的数学标准查询(选择 memid,CASE WHEN myMatchCriteria THEN 1 ELSE 0 END AS FinalResult)。 myMatchCriteria 的示例是 (C1 = 1 OR C2 = 1) AND (C3 = 1 OR C4 = 1), (C3 = 1 OR C4 = 1) 等我会知道在构建 myMatchCriteria 之前有多少 C 系列列是公用表表达式是这里好吗?如何在不使用任何临时表的情况下针对这种动态创建的查询结果运行查询。谢谢你,史密斯

以上是关于如何在 Transact/SQL 中创建数据透视表?的主要内容,如果未能解决你的问题,请参考以下文章

在 sql 中创建一个带联接的数据透视表

在 LibreOffice Base 中创建等效数据透视表的 SQL (HSQLDB) 查询

在R中创建“数据透视表”,每行填充因子值

如屏幕截图中所述,我想在 SQL 中创建一个数据透视表 [重复]

Java 在Excel中创建透视表

Java 在Excel中创建透视表