1

我试图玩弄PIVOTTSQL 命令,但我被卡住了。

我尝试了一些简约的例子,我也可以使用聚合函数来解决(所以请不要回答 using 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,...

谢谢

4

1 回答 1

2

目前尚不清楚您想要的列标题是什么,但基本的 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)
于 2013-09-06T11:17:21.317 回答