SQL JOIN で展開されるカウントをクエリ内で使う方法

結合しない対象テーブル1個だけなら、GROUP BY 句と COUNT関数を使うが、
JOIN で結合したときの展開されるレコード数を求めるあるいは使用した
クエリはどうずれば良いか?
目的が、
  結合元テーブルの任意カラムの数値 / 結合したときの展開されるレコード数
を1度のクエリで求めることである。

方法は2通りある。
(1)GROUP BYでカウントしたクエリと結合する方法
(2)ウィンドウ関数 OVER句を使って COUNTを求める方法

データベースが PostgreSQL で、以下のテーブルがあるとする。

CREATE TABLE items (
    id int4 NOT NULL,
    task_name varchar(60) NULL,
    point int4 DEFAULT 0 NOT NULL,
    CONSTRAINT items_pkey PRIMARY KEY (id)
)
CREATE TABLE itemcodes (
    task_name varchar(60) NOT NULL,
    task_code varchar(60) NULL
);

この items task_name が、itemcode task_name で結合しているとする。
求めたいのは、point が、 結合したときの展開されるレコード数で除算した値である。

(1)GROUP BYでカウントしたクエリと結合する方法

SELECT 
     a.task_name 
    ,b.task_code
    ,a.point
    ,c.t_cnt
    ,ROUND(a.point * 1.0 / c.t_cnt, 6) AS a_value
FROM items a
LEFT JOIN itemcodes b ON a.task_name = b.task_name
INNER JOIN (
    SELECT 
        task_name
        ,COUNT(task_name) AS t_cnt
    FROM itemcodes
    GROUP BY task_name
) c
ON b.task_name = c.task_name
ORDER BY a.task_name ASC

結合が増えて長くなるので良いとは思えない

(2)ウィンドウ関数 OVER句を使って COUNTを求める方法

SELECT 
     a.task_name 
    ,b.task_code
    ,a.point
    ,COUNT(b.task_name) OVER (PARTITION BY b.task_name) AS t_cnt
    ,ROUND(a.point * 1.0 / COUNT(b.task_name) OVER (PARTITION BY b.task_name), 6) AS a_value
FROM items a
LEFT JOIN itemcodes b ON a.task_name = b.task_name
ORDER BY a.task_name ASC

OVER句で、結合カラムで区切ることを示す列をPARTITION BY で指定する。

PlantUML Activity repeat backward にサブダイアグラムを使う

先日、Swim Lane を使用した PlantUML Activity で悩んだ。
oboe2uran.hatenablog.com

この時のもう1つの解としてサブダイアグラムで前のレーンで実行することを
表現したらどうであろう。

@startuml

|User|
start
:新規作成;

|システム|
repeat 

backward:{{
  "User"#fce2a0->[ ] "修正"
}};

|システム|
repeat while (検証?) is (差戻し)
:登録;

end

@enduml

サブダイアグラムは、{{ }} で囲って記述する
https://plantuml.com/ja/sub-diagram

VScode の markdown で表の罫線を出したい

VScodemarkdown 表(Table)のプレビューで罫線が出ないのが標準のようである。
使用している拡張機能は、Markdown All in One

CSS で table タグのスタイルを指定させて解決する。

VScode ワークスペースを使用していることが前提で、
ワークスペースの設定を開く
 コマンドパレットを開く(ctrl+Shift+P)
 「Preferences: Open User Settings (JSON)」 を選択。
 ワークスペース直下の .vscode フォルダ内に settings.json が存在しなければ、
 作成する。UTF-8 で良い。
JSON で、markdown.styles を書く。
CSS設定ファイル style.css の指定は、ワークスペースからのPATHで指定しなければならない。
注意が必要なのは、WindowsのPATH区切り文字 '\' 1個ではなく2個で書かないとならない。
.vscode フォルダ内に配置した場合は以下のとおり。

{
    "markdown.styles": [".vscode\\style.css"],
}

table のスタイルを style.css に書く。boder とヘッダのテキスト Bold 指定だけで済ませる。

table {
    border-collapse: collapse;
    border: 1px solid #000000 !important;
}
table th {
    font-weight: bold;
    border: 1px solid #000000 !important;
}
table td {
    border: 1px solid #000000 !important;
}

結果の確認、PDFで
VScode のマークダウンをPDF にエクスポートするのに以下を使う。
PDF以外にHTML 、JPEGPNG にエクスポートできるので、よくこれが使われているようだ。

エクスポートは、マークダウンを開いている状態で、コマンドパレットから
 markdown pdf と入力して選択する。

PCのスペックによると思うが、以外と時間かかる。

OpenIconic を使うときのサイズ

PlantUML いろんな場面で、名称、ワードの書き込みで、OpenIconic を使う。
https://plantuml.com/ja/openiconic

@startuml
listopeniconic
@enduml

で、使用できるアイコンの一覧を参照できる。

アイコンのサイズを指定しないデフォルトの描画は小さい

@startuml
start
:Some activity;
-><&bell>通知;
(A)
detach
(A)
:Other activity;
@enduml

スケールを 2.4倍にする。場合の書き方は、 { } で囲んで、

<&bell{scale=2.4}>

と書く。

ちょっと上付きになってしまうのを覚悟で使うことになる。

業務フローでよく使われるスイムレーンの悩ましいところ

PlantUML アクティビティ図で描画する業務フローは、差戻しの処理を前のレーンで描画するケース
repeat backward を前のレーンで書くと

@startuml

|A|
start
:新規作成;

|B|
repeat 
|A|
backward :修正;
|B|
repeat while (検証?) is (差戻し)
:登録;
end

@enduml

これは repeat while (検証?) の箇所に線が被ってしまう。

それなら、最初のレーンで if 文を使って表現する方法

@startuml

|A|
start

repeat
if (未作成?) then (yes)
:新規作成;
else (no)
:修正;
endif
|B|
repeat while (検証?) is (差戻し)
->OK;
:登録;
end

@enduml


実際のコーディングでは if 制御文が入らないであろうから
正確かどうかでいうとこの方法が見送られることもあろう。

while 文で表現する方法、こちらの方が実際のコーディングに近いのであるが。

@startuml

|A|
start
:新規作成;

|B|
while (検証) is (差戻し)
    |A|
    :修正;
    |B|
endwhile(OK)
:登録;
end

@enduml


戻りループの線が、レーンの線と重なってしまうとこの書き方は使えない。
最初に戻って、repeat backward を前のレーンで書かずに、
逆にすれば、( Aレーンの先にBレーンの存在を記述する)
  |B| の後に |A|

@startuml

|B|
|A|
start
:新規作成;

|B|
repeat 
|A|
backward :修正;
|B|
repeat while (検証?) is (差戻し)
:登録;
end

@enduml


でも、業務フローのレーンの左右、左側から開始しなければならないという
厳格なルールにするならこれは適合しない。

PlantUML アクティビティ図で note 以外の注釈

処理の導線に短い説明を付けるのに note で書きたくない場合、
if 文や、repeat 文は、以下のように、( ) 内に簡単なワードで表現することが多い

 if (条件) then (Yes)
 else (No)

repeat

repeat while (条件) is (戻る)

while

while (条件1) is (Yes)
	:処理B;
endwhile (No)

処理の間でこのような表現をしたい時は、->コメント; を処理の間に追加する。

@startuml

|__顧客__|
    :注文する;

|#AntiqueWhite|__販売部門__|
    :在庫を確認する;
     ->1分;
    :出荷を確認する;
     ->3分;
|__出荷部門__|
    :出荷する;
    fork

VScode PlantUML の画像エクスポートファイル名

VScode PlantUML の画像エクスポートファイル名は、PlantUML ファイル名でなく
@startuml 行で付けた文字列+”."+画像拡張子 になる。
VScodeでは、
PNG形式出力は
aaa.pu ⇒ aaa.png にはならない。

@startuml aaa

と書いて aaa.png になる。

しかも、最新の VScode では、@startuml 行に何もかかないと警告が出てる。