1

PIVOTTSQL コマンドを試してみましたが、行き詰まりました。

理解するために、集約関数を使用して解決できる最小限の例をいくつか試しました(したがって、使用については答えないでください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 回のレビュー、...

ありがとう

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 に答える