MW211 EXIT

devlog
MSSQL/マトリクス月間表
2021年11月10日
┌──────────────────────────────────────┐
│GO                                                                          │
│    DECLARE @引数年 [int];  SET @引数年 = 2021;                             │
│    DECLARE @引数月 [int];  SET @引数月 = 11;                               │
│    -- ---------------------------------------------------------------------│
│    SET NOCOUNT ON;--EXECUTEによる参照の場合はなくても大丈夫そうだが念のため│
│    DECLARE @sql    [nvarchar](max);                                        │
│    -- ---------------------------------------------------------------------│
│    --   列(@テーブル変数)                                                  │
│    -- ---------------------------------------------------------------------│
│    DECLARE @列 table (                                                     │
│        [日付]  [date]  NOT NULL,                                           │
│        PRIMARY KEY (                                                       │
│            [日付]  ASC                                                     │
│        )                                                                   │
│    );                                                                      │
│    WITH [カレンダM] AS (                                                  │
│             SELECT DATEFROMPARTS(@引数年, @引数月, 1) AS [日付]            │
│             UNION ALL                                                      │
│             SELECT DATEADD(dd, 1, [日付])             AS [日付]            │
│                 FROM [カレンダM]                                          │
│                 WHERE YEAR(DATEADD(dd, 1, [日付]))  = @引数年              │
│                   AND MONTH(DATEADD(dd, 1, [日付])) = @引数月              │
│         )                                                                  │
│    INSERT INTO @列                                                         │
│        SELECT [日付]                                                       │
│            FROM [カレンダM];                                              │
│    -- ---------------------------------------------------------------------│
│    --   行(#一時テーブル)                                                  │
│    -- ---------------------------------------------------------------------│
│    CREATE TABLE #行 (                                                      │
│        [キー]  [int]   NOT NULL,                                           │
│        PRIMARY KEY (                                                       │
│            [キー]  ASC                                                     │
│        )                                                                   │
│    );                                                                      │
│    INSERT INTO #行                                                         │
│        SELECT DISTINCT [キー]                                              │
│            FROM 入力データ                                                 │
│            WHERE YEAR([日付])  = @引数年                                   │
│              AND MONTH([日付]) = @引数月;                                  │
│    -- ---------------------------------------------------------------------│
│    --   行列(#一時テーブル)                                                │
│    -- ---------------------------------------------------------------------│
│    CREATE TABLE #行列 (                                                    │
│        [キー]  [int]   NOT NULL,                                           │
│        [日付]  [date]  NOT NULL,                                           │
│        [値]    [int]   NULL,                                               │
│        PRIMARY KEY (                                                       │
│            [キー]  ASC,                                                    │
│            [日付]  ASC                                                     │
│        )                                                                   │
│    );                                                                      │
│    INSERT INTO #行列                                                       │
│        SELECT [キー],                                                      │
│               [日付],                                                      │
│               SUM([値]) AS [値]                                            │
│            FROM 入力データ                                                 │
│            WHERE YEAR([日付])  = @引数年                                   │
│              AND MONTH([日付]) = @引数月                                   │
│            GROUP BY [キー],                                                │
│                     [日付];                                                │
│    -- ---------------------------------------------------------------------│
│    --   明細                                                               │
│    -- ---------------------------------------------------------------------│
│    SELECT @sql = ISNULL(@sql + ',','')                                     │
│                + '(SELECT COUNT(*)'                                        │
│                + '     FROM #行列'                                         │
│                + '     WHERE #行列.[キー] = #行.[キー]'                    │
│                + '       AND #行列.[日付] = '                              │
│                          + CHAR(39) + CONVERT([varchar], [日付]) + CHAR(39)│
│                + ') AS [' + FORMAT(DAY([日付]), '00') + ']'                │
│        FROM @列                                                            │
│        ORDER BY [日付] ASC;                                                │
│    SET @sql = 'SELECT #行.[キー],'                                         │
│             + @sql                                                         │
│             + '    FROM #行'                                               │
│             + '    ORDER BY #行.[キー] ASC;';                              │
│    EXECUTE (@sql);                                                         │
│    -- ---------------------------------------------------------------------│
│    --   一時テーブルの削除                                                 │
│    -- ---------------------------------------------------------------------│
│    DROP TABLE #行列;                                                       │
│    DROP TABLE #行;                                                         │
│GO                                                                          │
└──────────────────────────────────────┘
分類:MSSQL