MW211 EXIT

devlog
MSSQL/ピボット表
2015年07月10日
こんな感じ。
┌──────────────────────────────────────┐
│SELECT ISNULL(CONVERT(varchar, [群]), '計') AS [群],                        │
│       ISNULL([縦]                  , '計') AS [縦],                        │
│       SUM([横1])   AS [横1],                                             │
│       SUM([横2])   AS [横2],                                             │
│       SUM([横3])   AS [横3],                                             │
│       SUM([計])  AS [計]                                                   │
│    FROM (                                                                  │
│        SELECT [群],                                                        │
│               [縦],                                                        │
│               [横1],                                                      │
│               [横2],                                                      │
│               [横3],                                                      │
│               ([横1] + [横2] + [横3]) AS [計]                           │
│            FROM [表]                                                       │
│                PIVOT (COUNT([ID])                                          │
│                           FOR [区分]                                       │
│                           IN ([横1],[横2],[横3])) AS [ピボット]         │
│        UNION ALL                                                           │
│        SELECT [群D].[群],                                                 │
│               [縦D].[縦],                                                 │
│               NULL                  AS [横1],                             │
│               NULL                  AS [横2],                             │
│               NULL                  AS [横3],                             │
│               NULL                  AS [計]                                │
│            FROM (                                                          │
│                SELECT DISTINCT [群]                                        │
│                    FROM [表]                                               │
│            ) AS [群D]                                                     │
│                CROSS JOIN (                                                │
│                    SELECT DISTINCT [縦]                                    │
│                        FROM [表]                                           │
│                ) AS [縦D]                                                 │
│    ) AS [ピボットD]                                                       │
│    GROUP BY GROUPING SETS (                                                │
│                 (),                                                        │
│                 ([縦]),                                                    │
│                 ([群]),                                                    │
│                 ([群],[縦])                                                │
│             )                                                              │
│    ORDER BY [群] ASC,                                                      │
│             [縦] ASC;                                                      │
└──────────────────────────────────────┘
こんな結果になる(はず)。
┌──┬──┬──┬──┬──┬──┐
│ 群 │ 縦 │横1│横2│横3│ 計 │
├──┼──┼──┼──┼──┼──┤
│    │    │    │    │    │    │
│    ├──┼──┼──┼──┼──┤
│    │    │    │    │    │    │
│    ├──┼──┼──┼──┼──┤
│    │ 計 │    │    │    │    │
├──┼──┼──┼──┼──┼──┤
│ 計 │ 計 │    │    │    │    │
└──┴──┴──┴──┴──┴──┘
分類:MSSQL
ExcelVBA/進捗表示
2015年07月09日
進捗状況を確認したい場合、いちいちメッセージダイアログを開くと
閉じる作業が必要になり、全然自動化じゃなくなってしまう。

そこで、ステータスバーに出しまくるという方法を使うと便利。
┌──────────────────────────────────────┐
│Application.StatusBar = "メッセージ"                                        │
└──────────────────────────────────────┘

上書しまくりOKで、最後にメッセージを消去したい場合には、以下の様にする。
┌──────────────────────────────────────┐
│Application.StatusBar = False                                               │
└──────────────────────────────────────┘

なお、処理が重くなると、表示も固まってしまいがちなので
こういった場合は「DoEvents」と併用した方がよいようだ。
┌──────────────────────────────────────┐
│DoEvents                                                                    │
│Application.StatusBar = "メッセージ"                                        │
└──────────────────────────────────────┘
分類:ExcelVBA
MSSQL/列間の部分一致検索
2015年07月07日
LIKE演算子による部分一致判定を、列間で実行する場合。

意外に単純、'%'を文字列として結合してあげればよい。

列大が列小を内包しているもののみ抽出(部分一致検索)
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表                                                                 │
│    WHERE 列大 LIKE '%' + 列小 + '%';                                       │
└──────────────────────────────────────┘

列大が列小を内包しているもののみ抽出(前方部分一致検索)
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表                                                                 │
│    WHERE 列大 LIKE 列小 + '%';                                             │
└──────────────────────────────────────┘
分類:MSSQL
SQL/末端階層の前詰(2)
2015年07月06日
親列と子列のある表で、子列を前詰で作成したい場合(前詰にしたい場合)
┌───┐  ┌───┐
│親  子│→│親  子│
│--  --│  │--  --│
│ 1   3│  │ 1   1│
│ 1   4│  │ 1   2│
│ 2   6│  │ 2   1│
│ 2   8│  │ 2   2│
└───┘  └───┘
┌──────────────────────────────────────┐
│UPDATE 表                                                                   │
│    SET 子列 = 入力D.新子列                                                │
│    FROM 表 AS 出力D                                                       │
│        INNER JOIN (                                                        │
│            SELECT 親列,                                                    │
│                   子列,                                                    │
│                   RANK() OVER(                                             │
│                       PARTITION BY 親列                                    │
│                       ORDER BY 子列 ASC                                    │
│                   ) AS 新子列                                              │
│                FROM 表                                                     │
│        ) AS 入力D                                                         │
│          ON  入力D.親列 = 出力D.親列                                     │
│          AND 入力D.子列 = 出力D.子列;                                    │
└──────────────────────────────────────┘
分類:SQL
SQL/末端階層の前詰(1)
2015年07月05日
連番と親列のある表で、子列を前詰で作成したい場合(前詰にしたい場合)
┌──────┐  ┌──────┐
│連番  親  子│→│連番  親  子│
│----  --  --│  │----  --  --│
│   1   1   0│  │   1   1   1│
│   2   1   0│  │   2   1   2│
│   3   2   0│  │   3   2   1│
│   4   2   0│  │   4   2   2│
└──────┘  └──────┘
┌──────────────────────────────────────┐
│UPDATE 表                                                                   │
│    SET 子列 = 入力D.子列                                                  │
│    FROM 表 AS 出力D                                                       │
│        INNER JOIN (                                                        │
│            SELECT 連番,                                                    │
│                   RANK() OVER(                                             │
│                       PARTITION BY 親列                                    │
│                       ORDER BY 連番 ASC                                    │
│                   ) AS 子列                                                │
│                FROM 表                                                     │
│        ) AS 入力D                                                         │
│          ON  入力D.連番 = 出力D.連番;                                    │
└──────────────────────────────────────┘
分類:SQL
SQL/中間階層の前詰
2015年07月04日
大列、中列、小列のある表で、中列を前詰にしたい場合
┌─────┐  ┌─────┐
│大  中  小│→│大  中  小│
│--  --  --│  │--  --  --│
│A    3   1│  │A    1   1│
│A    3   2│  │A    1   2│
│A    5   1│  │A    2   1│
│A    5   2│  │A    2   2│
└─────┘  └─────┘
┌──────────────────────────────────────┐
│UPDATE 表                                                                   │
│    SET 中列 = 入力D.新中列                                                │
│    FROM 表 AS 出力D                                                       │
│        INNER JOIN (                                                        │
│            SELECT 大列,                                                    │
│                   中列,                                                    │
│                   RANK() OVER(                                             │
│                       PARTITION BY 大列                                    │
│                       ORDER BY 中列 ASC                                    │
│                   ) AS 新中列                                              │
│                FROM (                                                      │
│                    SELECT DISTINCT 大列,                                   │
│                                    中列                                    │
│                        FROM 表                                             │
│                ) AS 中D                                                   │
│        ) AS 入力D                                                         │
│          ON  入力D.大列 = 出力D.大列                                     │
│          AND 入力D.中列 = 出力D.中列;                                    │
└──────────────────────────────────────┘
分類:SQL
MSSQL/キャストの順番とNULL
2015年07月03日
date型の[日付]という列を、文字型(varchar(16))に型変換する時に
NULLが混じっていたら空文字('')にするというSQL文
ISNULL()とCONVERT()を駆使する訳だが、順番を間違えると以下の違いが出てしまう
┌──────────────────────────────────────┐
│SELECT ISNULL(CONVERT(varchar(16), [日付]), '') FROM 表;              →NULL│
├──────────────────────────────────────┤
│SELECT CONVERT(varchar(16), ISNULL([日付], '')) FROM 表;        →1900-01-01│
└──────────────────────────────────────┘

これはdate型に空文字('')を入れると、初期値(1900-01-01)になるからだ
┌──────────────────────────────────────┐
│SELECT ISNULL([日付], '') FROM 表;                              →1900-01-01│
└──────────────────────────────────────┘

一番単純な例は以下(空文字('')をdate型に型変換するとやはり初期値になる)
┌──────────────────────────────────────┐
│SELECT CONVERT(date, '');                                       →1900-01-01│
└──────────────────────────────────────┘

なので、順番を間違えないように気をつけなければならない
分類:MSSQL
MSSQL/FORMAT()とNULL
2015年07月02日
FORMAT()の引数にNULL直書きはエラーとなる
┌──────────────────────────────────────┐
│SELECT FORMAT(NULL,'0');                                                    │
│                 →引数のデータ型 NULL は format 関数の引数 1 では無効です。│
└──────────────────────────────────────┘

これはFORMAT()がNULLを許容していないのではなく、
型が不定なNULLを許容していないのだ

つまり、以下だとOK
┌──────────────────────────────────────┐
│SELECT FORMAT(CAST(NULL AS int),'0');                                 →NULL│
└──────────────────────────────────────┘

なので、テーブル上のNULLデータの場合は、テーブル定義で型も決まっているので
エラーとはならない

デバッグでうっかり勘違いしてしまいがちなところだ
分類:MSSQL
JavaScript/配列操作(PHPとの比較)
2015年07月01日
┌──────────────────┬──────────────────┐
│                PHP                 │             JavaScript             │
├──────────────────┼──────────────────┤
│文字列 = implode(区切文字, 配列);   │文字列 = 配列.join(区切文字);       │
├──────────────────┼──────────────────┤
│配列 = explode(区切文字, 文字列);   │配列 = 文字列.split(区切文字);      │
└──────────────────┴──────────────────┘
分類:JavaScript
Windows/ファイルの更新日時
2015年06月29日
ファイルをコピー(複写)した時に、作成日時が更新される点に注意。
┌───────────┬───┬───┬───┬───┬──────────┐
│    ●=最新日時に更新│ 作成 │ 上書 │ 複写 │ 移動 │  プロパティの場所  │
├───────────┼───┼───┼───┼───┼──────────┤
│①作成日時            │  ●  │  ○  │  ●  │  ○  │全般、詳細/ファイル│
├───────────┼───┼───┼───┼───┼──────────┤
│②更新日時            │  ●  │  ●  │  ○  │  ○  │全般、詳細/ファイル│
├───────────┼───┼───┼───┼───┼──────────┤
│③アクセス日時        │  ●  │  ●  │  ●  │○(*2)│全般、詳細/ファイル│
├───────────┼───┼───┼───┼───┼──────────┤
│④コンテンツの作成日時│  ●  │  ○  │  ○  │  ○  │詳細/元の場所(*1)  │
├───────────┼───┼───┼───┼───┼──────────┤
│⑤前回保存日時        │  ●  │  ●  │  ○  │  ○  │詳細/元の場所(*1)  │
└───────────┴───┴───┴───┴───┴──────────┘
  *1:WordやExcelなどの場合のみ
  *2:異なるドライブへ移動した場合は●
分類:Windows
前へ 1 … 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 … 156 次へ