【问题标题】:Using PIVOT TSQL command使用 PIVOT SQL 命令
【发布时间】:2013-09-06 11:11:18
【问题描述】:

我尝试过使用PIVOT TSQL 命令,但卡住了。

我尝试了一些简单的示例,我也可以使用聚合函数来解决(所以请不要回答有关使用 COUNT 的问题),只是为了理解。

这是一个例子:

CREATE TABLE [dbo].[TestTable](
    [EventType] [varchar](50) NULL,
    [Date] [datetime] NULL
) 
GO

insert into TestTable values ('Meeting', '2013-01-01')
insert into TestTable values ('Meeting', '2012-02-02')
insert into TestTable values ('Review', '2013-01-01')
insert into TestTable values ('Review', '2012-01-01')
insert into TestTable values ('Other', '2012-05-05')

您能否告诉我使用PIVOT 以获得每年和每个类型结果的查询? 我预计:2013 年 1 次会议,2012 年 1 次,2013 年 1 次 Revview,...

谢谢

【问题讨论】:

    标签: sql-server sql-server-2008-r2 pivot


    【解决方案1】:

    您对列标题的要求并不完全清楚,但基本的 PIVOT 语法如下。

    如果您希望年份作为列标题,那么您可以使用:

    select EventType, [2013], [2012]
    from
    (
        select EventType, 
            date = year(date)
        from dbo.testTable
    ) d
    pivot
    (
        count(date)
        for date in ([2013], [2012])
    ) piv;
    

    如果您希望 EventTypes 成为列标题:

    select year, Meeting, Review, Other
    from
    (
        select EventType, 
            year = year(date) 
        from dbo.testTable
    ) d
    pivot
    (
        count(EventType)
        for EventType in (Meeting, Review, Other)
    ) piv;
    

    如果你有未知数量的值,那么你可以使用动态 SQL 来获取结果:

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @cols = STUFF((SELECT distinct ',' + QUOTENAME(EventType) 
                        from dbo.testTable
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = 'SELECT year,' + @cols + ' 
                from 
                (
                  select EventType, 
                      year = year(date) 
                  from dbo.testTable
                ) x
                pivot 
                (
                    count(EventType)
                    for EventType in (' + @cols + ')
                ) p '
    
    execute(@query)
    

    【讨论】:

    • 非常感谢,现在我清楚了。还有一点需要注意:如果我想(从第一个示例中)仅过滤 2012 年的事件,我应该在查询中添加 where 条件,或者是否也可以在 pivot 中执行?
    • @user193655 如果您想使用 WHERE 过滤器,那么您可以在转置之前将其放入子查询中。
    • 通过测试我又发现了一个问题。如何列出所有 EventType,因此如何避免编写 in (Meeting, Review, Other) (请参阅您的第二个示例)。那么如何自动拥有列标题呢?
    • 只是为了确保以某种方式表达了自己,我需要像这样执行一些事情:for EventType in (select distinct EventType from TestTable where EventType <> 'Other')
    • @user193655 如果事件类型未知,您将不得不使用动态 sql,请参阅我的编辑
    猜你喜欢
    • 2021-12-07
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多