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
Excel/図形のサイズ変更
2021年11月09日
図形の境界線をつかんでサイズを変更する際に、
以下のキーを複合するといい感じにサイズが調整される。
┌──────┬──────────────────┐
│Alt         │セルの境界線に合わせてサイズ変更    │
├──────┼──────────────────┤
│Ctrl        │中心固定でサイズ変更                │
├──────┼──────────────────┤
│Shift       │縦横比率固定でサイズ変更            │
├──────┼──────────────────┤
│Ctrl+Shift │中心固定かつ縦横比率固定でサイズ変更│
└──────┴──────────────────┘
分類:Excel
Excel/数式で「0」が表示される問題対策
2021年11月08日
空欄セルを数式で指定すると「0」が表示される問題。
┌─┬──┬──┐  ┌─┬──┬──┐
│  │ A  │ B  │  │  │ A  │ B  │
├─┼──┼──┤→├─┼──┼──┤
│ 1│    │=A1 │  │ 1│    │   0│
└─┴──┴──┘  └─┴──┴──┘
解決方法は以下の通り。

(1) B1の書式が文字列の場合  →「0」と表示されてしまう
  ┌──┬───┐
  │数式│=A1&""│
  └──┴───┘
(2) B1の書式が数値の場合  →「0」と表示されてしまう
  ┌────────┬─┐
  │書式のユーザ定義│# │
  └────────┴─┘
  これだと数値「0」が表示できなくなるが、それが嫌なら(1)+右寄せか。

(3) B1の書式が日付の場合  →「1900/1/0」と表示されてしまう
  ┌────────┬──────┐
  │書式のユーザ定義│yyyy/m/d;;; │
  └────────┴──────┘
  日付の場合、(1)だと「2021/11/8」→「44508」のように
  シリアル値表示になってしまう。
  よって、日付については書式で回避するのがよいだろう。
  ちなみに「;」が3つ並んでいて、4つのブロックに分かれているが
  それぞれ以下の条件の場合という意味になる
    (左から1番目)正数の場合  →唯一表示する
    (左から2番目)負数の場合
    (左から3番目)ゼロの場合  →空欄なので「0」を抑止している
    (左から4番目)文字列の場合
分類:Excel
PDO/続・MSSQLストアドプロシージャの戻り値取得
2021年11月01日
「警告: NULL 値は集計またはその他の SET 演算で削除されました。」が出ることにより
戻り値が取得できない問題についての解決策を考えた。

(案1)「SET ANSI_WARNINGS OFF;」で警告を無視する
  手っ取り早い方法だ。
  ただ、副作用が気になる。(例えば除数0エラーが検出できないとか)

(案2)「SUM(ISNULL(列, 0))」でNULLを0にして集計する
  確実な方法だ。
  ただ、処理時間が気になる。
  ちなみに「ISNULL(SUM(列), 0)」では効果はない。
  なお、NULLの集まりなのでNULLとして認識したい場合は、この案は採用できない。

(案3)戻り値を別ルートで取得する
  プレースホルダのoutputみたいな項目を通じて取得できないものか
  …と思ったが、できなさそうなので断念。

ということで、ひとまず(案2)が妥当なのだろう。(急を要するなら(案1)だけど)

なお、以下で検証ができる。
┌──────────────────────────────────────┐
│SELECT SUM([値]) FROM (VALUES (0),(NULL)) AS [表]([値]);                    │
└──────────────────────────────────────┘
分類:PDO
前へ 1 次へ