2

既存のテーブルをピボットして回転させ、レポートを生成したい(クロス集計)。vals列は、date_a列とdate_e列の一意の組み合わせによって決定されることがわかります。これを行う方法がわかりません。

4

1 に答える 1

1

このようなもの:

テストデータ

CREATE TABLE #tbl(date_a DATE,date_e DATE, vals FLOAT)

INSERT INTO #tbl
VALUES
    ('2/29/2012','1/1/2013',28.47),
    ('2/29/2012','2/1/2013',27.42),
    ('2/29/2012','3/1/2013',24.36),
    ('3/1/2012','1/1/2013',28.5),
    ('3/1/2012','2/1/2013',27.35),
    ('3/1/2012','3/1/2013',24.39),
    ('3/6/2012','1/1/2013',27.75),
    ('3/6/2012','2/1/2013',26.63),
    ('3/6/2012','3/1/2013',23.66)

クエリ

SELECT
    *
FROM
(   
    SELECT
        tbl.date_a,
        tbl.date_e,
        vals
    FROM
        #tbl AS tbl
) AS SourceTable
PIVOT
(
    SUM(vals)
    FOR date_e IN ([1/1/2013],[2/1/2013],[3/1/2013])
) AS pvt

DROP TABLE #tbl

編集

列の数がわからない場合は、動的を実行する必要がありますpivot。このような:

ユニークな列

DECLARE @cols VARCHAR(MAX)
;WITH CTE
AS
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY date_e ORDER BY date_e) AS RowNbr,
        tbl.*
    FROM
        #tbl AS tbl
)
SELECT @cols=STUFF
(
    (
        SELECT 
            ',' +QUOTENAME(date_e)
        FROM
            CTE
        WHERE
            CTE.RowNbr=1
        FOR XML PATH('')
    )
,1,1,'')

動的ピボット

DECLARE @query NVARCHAR(4000)=
N'SELECT
    *
FROM
(   
    SELECT
        tbl.date_a,
        tbl.date_e,
        vals
    FROM
        #tbl AS tbl
) AS SourceTable
PIVOT
(
    SUM(vals)
    FOR date_e IN ('+@cols+')
) AS pvt'
EXECUTE(@query)
于 2012-04-17T10:43:46.557 に答える