Sql server 使用pivottsql命令

Sql server 使用pivottsql命令,sql-server,sql-server-2008-r2,pivot,Sql Server,Sql Server 2008 R2,Pivot,我试着使用PIVOT-TSQL命令,但是我被卡住了 我尝试了一些简单的例子,我也可以使用聚合函数来解决,所以请不要回答使用计数,只是为了理解 例如: CREATE TABLE [dbo].[TestTable]( [EventType] [varchar](50) NULL, [Date] [datetime] NULL ) GO insert into TestTable values ('Meeting', '2013-01-01') insert into TestTa

我试着使用PIVOT-TSQL命令,但是我被卡住了

我尝试了一些简单的例子,我也可以使用聚合函数来解决,所以请不要回答使用计数,只是为了理解

例如:

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


谢谢

现在还不清楚您想要的列标题是什么,但是基本的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中设置where条件?@user193655如果你想使用where过滤器,那么你可以在pivot之前将其放置在子查询中。通过测试,我发现了另一个问题。如何列出所有EventType,如何避免在会议中编写、审阅或其他内容,请参考第二个示例。那么如何自动拥有列标题呢?为了确保以某种方式表达了我自己,我需要执行如下操作:对于TestTable中的EventType,从TestTable中选择distinct EventType,其中EventType'Other'@user193655,如果事件类型未知,则必须使用动态sql,请参阅我的编辑