MW211 EXIT

devlog
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
会計/請求締・支払締
2015年06月28日
┌──────────────────────────────────────┐
│        期首日┬                                                            │
│              │                                                            │
│              │                                                            │
│              │                                                            │
│売上日(出荷日)┼    仕訳「売掛金/売  上」                                  │
│              │                ↑                                          │
│              │                │                                          │
│              │                │                                          │
│      請求締日┼  ───────┘確定(請求締)    ─→得意先に請求する      │
│              │                                                            │
│売上日(出荷日)┼    仕訳「売掛金/売  上」                                  │
│              │                ↑                                          │
│        期末日┴  ───────┘仮確定(期末締)  ─→次回請求締にまとめる  │
└──────────────────────────────────────┘
┌──────────────────────────────────────┐
│        期首日┬                                                            │
│              │                                                            │
│              │                                                            │
│              │                                                            │
│仕入日(入荷日)┼    仕訳「仕  入/買掛金」                                  │
│              │                ↑                                          │
│              │                │                                          │
│              │                │                                          │
│      支払締日┼  ───────┘確定(支払締)    ─→仕入先から請求される  │
│              │                                                            │
│仕入日(入荷日)┼    仕訳「仕  入/買掛金」                                  │
│              │                ↑                                          │
│        期末日┴  ───────┘仮確定(期末締)  ─→次回支払締にまとめる  │
└──────────────────────────────────────┘
基本的に、売上は「出荷基準」(出荷日が売上日)、
仕入は「入荷基準」(入荷日が仕入日)である。

これらを確定させるのが「締日」である。

一般的な商慣習では「○日締、○日支払」みたいな感じで、
締日の数日後(ちなみにいずれも大抵は五の倍数)に、現金等のやりとりが発生する。

締日は得意先側(支払側)で各々で設定されているので
売上(請求)を管理する場合には、各得意先の締日を把握する必要がある。

但し、会計上はあくまで期末時点での残高を要求されるので、
請求締日(支払締日)から期末日までの間の分を再度締めなければならない。

これが期末締(売掛締・買掛締)である。
請求締(支払締)から見れば、途中で仮締を行うようなものである。
(逆に会計的な立場(=期末締)から見れば請求締(支払締)の方が仮締になる)
分類:経営学
ExcelVBA/引数の省略
2015年06月27日
┌──────────────────────────────────────┐
│CREATE FUNCTION [dbo].[関数](                                               │
│    @引数   int = 0                                                         │
│) RETURNS @結果 int                                                         │
│AS                                                                          │
│BEGIN                                                                       │
│  :処理                                                                    │
│END;                                                                        │
└──────────────────────────────────────┘
MSSQLのストアドファンクションでは上記のような感じだが(なぜそれを例にする?!)
ExcelVBAの場合は、以下のようか感じである。
┌──────────────────────────────────────┐
│Sub 関数(Optional ByVal 引数 As Long = 0)                                   │
│  :処理                                                                    │
│End Sub                                                                     │
└──────────────────────────────────────┘
引数の先頭に「Optional」修飾子をつけてあげればよい。
分類:ExcelVBA
MSSQL/累積列の作り方
2015年06月26日
[+表]と[-表]を統合して時系列で二列に並べて累積を逐一計算する場合は、
以下のような感じ
┌──────────────────────────────────────┐
│SELECT [±表].[日付],                                                       │
│       CASE [±表].[±区分]                                                 │
│         WHEN 1 THEN '+'                                                   │
│         WHEN 2 THEN '-'                                                   │
│       END AS [区分],                                                       │
│       [±表].[+値],                                                       │
│       [±表].[-値],                                                       │
│       ISNULL((                                                             │
│           SELECT SUM([+表].[値])                                          │
│               FROM [+表]                                                  │
│               WHERE [+表].[日付] < [±表].[日付]                          │
│                  OR  ([+表].[日付]   =  [±表].[日付]                     │
│                   AND [+表].[±区分] <= [±表].[±区分])                  │
│       ), 0) - ISNULL((                                                     │
│           SELECT SUM([-表].[値])                                          │
│               FROM [-表]                                                  │
│               WHERE [-表].[日付] < [±表].[日付]                          │
│                  OR  ([-表].[日付]   =  [±表].[日付]                     │
│                   AND [-表].[±区分] <= [±表].[±区分])                  │
│       ), 0) AS [累積]                                                      │
│    FROM (                                                                  │
│        SELECT [日付],                                                      │
│               1         AS [±区分],                                       │
│               SUM([値]) AS [+値],                                         │
│               NULL      AS [-値]                                          │
│            FROM [+表]                                                     │
│            GROUP BY [日付]                                                 │
│        UNION ALL                                                           │
│        SELECT [日付],                                                      │
│               2         AS [±区分],                                       │
│               NULL      AS [+値],                                         │
│               SUM([値]) AS [-値]                                          │
│            FROM [-表]                                                     │
│            GROUP BY [日付]                                                 │
│    ) AS [±表]                                                             │
│    ORDER BY [±表].[日付]   ASC,                                           │
│             [±表].[±区分] ASC;                                           │
└──────────────────────────────────────┘
[-表]がなければ、もっとシンプルになる。
┌──────────────────────────────────────┐
│SELECT [±表].[日付],                                                       │
│       [±表].[+値],                                                       │
│       ISNULL((                                                             │
│           SELECT SUM([+表].[値])                                          │
│               FROM [+表]                                                  │
│               WHERE [+表].[日付] <= [±表].[日付]                         │
│       ), 0) AS [累積]                                                      │
│    FROM (                                                                  │
│        SELECT [日付],                                                      │
│               SUM([値]) AS [+値]                                          │
│            FROM [+表]                                                     │
│            GROUP BY [日付]                                                 │
│    ) AS [±表]                                                             │
│    ORDER BY [±表].[日付] ASC;                                             │
└──────────────────────────────────────┘
分類:MSSQL
MSSQL/時間を区切る
2015年06月25日
深夜残業は「22:00」以降と決まっているのだけれども
[残業開始日時]がまちまちで、[残業分]を「22:00」を境に
二つ([普通残業分]と[深夜残業分])に区切る方法。
┌──────────────────────────────────────┐
│SELECT CASE                                                                 │
│         WHEN [残業分] > DATEDIFF(MINUTE,                                   │
│                                  [残業開始日時],                           │
│                                  DATEADD(HOUR,                             │
│                                          22,                               │
│                                          CONVERT(datetime,                 │
│                                                  CONVERT(date,             │
│                                                          [残業開始日時]))))│
│         THEN                                                               │
│           DATEDIFF(MINUTE,                                                 │
│                   [残業開始日時],                                          │
│                   DATEADD(HOUR,                                            │
│                           22,                                              │
│                           CONVERT(datetime,                                │
│                                   CONVERT(date,                            │
│                                           [残業開始日時]))))               │
│         ELSE                                                               │
│           [残業分]                                                         │
│       END AS [普通残業分]                                                  │
│       CASE                                                                 │
│         WHEN [残業分] > DATEDIFF(MINUTE,                                   │
│                                  [残業開始日時],                           │
│                                  DATEADD(HOUR,                             │
│                                          22,                               │
│                                          CONVERT(datetime,                 │
│                                                  CONVERT(date,             │
│                                                          [残業開始日時]))))│
│         THEN                                                               │
│           [残業分] - DATEDIFF(MINUTE,                                      │
│                               [残業開始日時],                              │
│                               DATEADD(HOUR,                                │
│                                       22,                                  │
│                                       CONVERT(datetime,                    │
│                                               CONVERT(date,                │
│                                                       [残業開始日時]))))   │
│         ELSE                                                               │
│           0                                                                │
│       END AS [深夜残業分]                                                  │
│    FROM [表];                                                              │
└──────────────────────────────────────┘
分類:MSSQL
前へ 1 … 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 … 156 次へ