sql >> データベース >  >> RDS >> Sqlserver

SQL Server 2008 R2 - (移動する) 日付による動的なピボット/アンピボット

    最初に UNPIVOT する必要があります 私たちの列と使用 DENSE_RANK() 後でピボットする何かを提供します。 DESNSE_RANK のコンマ区切りリストを取得できるように、この結果を一時テーブルに入れます。 列。次に UNION を作成します Day および Date ピボットが解除されたものと同じ列の一部です。これは、動的 SQL で使用するためにグローバル一時テーブルに入れることができます。列のリストを格納する変数を作成し、動的 ​​SQL を構築して実行します。

    完全な例 (明らかに PhaseFlowChart を削除しないでください) 表)

    -- pre-cleanup
    IF OBJECT_ID('[dbo].[PhaseFlowChart]') IS NOT NULL
        DROP TABLE [dbo].[PhaseFlowChart]
    GO
    
    IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
        DROP TABLE #tmp
    GO
    
    IF OBJECT_ID('tempdb..##tmp') IS NOT NULL
        DROP TABLE ##tmp
    GO
    
    -- setup table and data
    CREATE TABLE [dbo].[PhaseFlowChart](
        [pfckey] [int] NULL,
        [hourlykey] [bigint] NULL,
        [daykey] [bigint] NULL,
        [weekkey] [int] NULL,
        [monthkey] [int] NULL,
        [bbkey] [int] NULL,
        [Day] [varchar](100) NULL,
        [Date] [varchar](100) NULL,
        [Bull Bear Gap] [varchar](100) NULL,
        [Monthly] [varchar](100) NULL,
        [Weekly] [varchar](100) NULL,
        [Daily] [varchar](100) NULL,
        [Hour 1] [varchar](100) NULL,
        [Hour 2] [varchar](100) NULL,
        [Hour 3] [varchar](100) NULL,
        [Hour 4] [varchar](100) NULL,
        [Hour 5] [varchar](100) NULL,
        [Hour 6] [varchar](100) NULL,
        [Hour 7] [varchar](100) NULL
    ) ON [PRIMARY]
    
    INSERT INTO [dbo].PhaseFlowChart 
        ([Day], [Date], [Bull Bear Gap], Monthly, Weekly, Daily, 
            [Hour 1], [Hour 2], [Hour 3], [Hour 4], [Hour 5], [Hour 6], [Hour 7])
    VALUES
    ('MON', '20130101', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1'),
    ('TUE', '20130102', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2'),
    ('WED', '20130103', 'P3', 'P3', 'P3', 'P3', 'P3', 'P3', 'P3', 'P3', 'P3', 'P3', 'P3'),
    ('THU', '20130104', 'P4', 'P4', 'P4', 'P4', 'P4', 'P4', 'P4', 'P4', 'P4', 'P4', 'P4'),
    ('FRI', '20130105', 'P5', 'P5', 'P5', 'P5', 'P5', 'P5', 'P5', 'P5', 'P5', 'P5', 'P5'),
    ('SAT', '20130106', 'P6', 'P6', 'P6', 'P6', 'P6', 'P6', 'P6', 'P6', 'P6', 'P6', 'P6'),
    ('SUN', '20130107', 'P7', 'P7', 'P7', 'P7', 'P7', 'P7', 'P7', 'P7', 'P7', 'P7', 'P7')
    GO
    
    -- unpivot the columns into 'categories'
    SELECT [Day], [Date], [Value], [Category], 
        DENSE_RANK() OVER (ORDER BY CAST([Date] AS DATE)) dr 
    INTO #tmp
    FROM PhaseFlowChart pfc
    UNPIVOT (
        Value FOR Category IN ([Bull Bear Gap], Monthly, Weekly, Daily, 
                                [Hour 1], [Hour 2], [Hour 3], [Hour 4], 
                                    [Hour 5], [Hour 6], [Hour 7])
    
    ) upiv
    
    -- create a global temp table for use later
    SELECT *
    INTO ##tmp
    FROM (
          -- union data into single category column
        SELECT 'Day' Category, [Day] Value, dr, 1 o FROM #tmp
        UNION ALL
        SELECT 'Date' Category, [Date] Value, dr, 2 o FROM #tmp
        UNION ALL
        SELECT [Category], Value, dr, 3 o FROM #tmp
    ) t
    
    -- get a comma seperated list of columns for the PIVOT
    DECLARE @cols VARCHAR(MAX) = 
    STUFF(CAST((SELECT ',' + QUOTENAME(dr)
           FROM (
               SELECT DISTINCT dr
               FROM #tmp
           ) t
           ORDER BY dr
           FOR XML PATH(''), TYPE
          ) AS VARCHAR(MAX)),1,1,'')
    
    -- create and execute the sql
    DECLARE @sql VARCHAR(MAX) = '
        SELECT Category, ' + @cols + '
        FROM ##tmp
        PIVOT (
            MAX([Value])
            FOR dr IN (' + @cols + ')
        ) piv   
          ORDER BY o, CASE Category 
                        WHEN ''Daily'' THEN 4
                        WHEN ''Weekly'' THEN 3
                        WHEN ''Monthly'' THEN 2
                        WHEN ''Bull Bear Gap'' THEN 1
                        ELSE 5 END, Category
    '
    
    EXEC(@sql)
      


    1. mysqldumpを使用して1行に1つの挿入をフォーマットしますか?

    2. LINQ2SQL-内部結合が必要なときに発行されるクロス結合

    3. MariaDBのバグ?壊れた脱出のように

    4. PDOを初期化するとき-私はすべきですか:charset=UTF8またはcharset=UTF8MB4?