グラフの種類は 9 つあります。棒・横棒・積層棒・横積層棒・折れ線・エリア・円・ドーナツ・複合。9 通りの書き方を覚える必要はありません。SQL の形は 4 通りしかないからです。
kSQL Dashboard Pro のグラフは、返した列の並びで役割が決まります。どの形で返すかを決めれば、あとは表示タイプを選ぶだけです。この記事では SQL・ペイン設定・表示結果を 1 セットにして、14 種類のグラフを作ります。SQL はすべてコピペで動きます。
kSQL Dashboard Pro デモ(全 5 回)
⓪ 準備編 / ① KPI カード / ② データ表 / ③ グラフ(この記事) / ④ マークダウン**アプリの用意は ⓪ 準備編**にまとめてあります(5 本とも同じアプリを使います)。
前提
| 項目 | 本記事の前提 |
|---|---|
| プラグイン | kSQL Dashboard Pro Ver.1 |
| SQL エンジン | kintone-sql-tools 3.66.1 系 |
| kintone | 公式対応ブラウザの最新版(PC)。モバイルは対象外 |
| 対象アプリ | 売上明細(約 1,500 件) |
アプリの作り方とデータの入れ方は ⓪ 準備編にまとめてあります。 この記事は売上明細 1 本だけで完結します。
分類の数がグラフの見え方を決めます。 この記事では、12 種の商品カテゴリで「上位 N + その他」を、8 区分の地域で色の見分けを、4 区分の大分類で積み上げの内訳を見せます。
記事の言葉と、設定画面の表示タイプ名
一般的な呼び方と設定画面のラベルが少し違います。選ぶときはこの表の右側を探してください。
| この記事の言い方 | 設定画面の表示タイプ |
|---|---|
| 棒 | 棒 |
| 横棒 | 横棒 |
| 積み上げ棒 | 積層棒 |
| 横積み上げ棒 | 横積層棒 |
| 折れ線 | 折れ線 |
| 面 | エリア |
| 円 | 円 |
| ドーナツ | ドーナツ |
| 複合(2 軸) | 複合 |
SQL の形は 4 通り
これがこの記事の背骨です。9 種類のグラフは、返す列の形で 4 つに分かれます。
| 形 | 返す列 | 使える表示タイプ |
|---|---|---|
| ① | ラベル + 値(2 列) | 棒 / 横棒 / 円 / ドーナツ |
| ② | X 軸 + 値(値は複数列可 = 複数系列) | 折れ線 / エリア |
| ③ | ロング形式 3 列(X 軸・系列キー・値) | 積層棒 / 横積層棒 |
| ④ | X 軸 + 値 2 本以上 | 複合 |
形①②④は「1 行 = 1 カテゴリ、系列は列」という並び(ワイド形式)です。形③だけが「カテゴリ + 系列キー + 値の 3 列」(ロング形式)で、mapping の指定が要ります。
形① ラベル + 値
棒 — 商品カテゴリ別の件数
SELECT 商品カテゴリ, COUNT(*) AS 件数
FROM APP4239
WHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定'
GROUP BY 商品カテゴリ
ORDER BY 件数 DESC
表示タイプは「棒」。設定は何も要りません。
軸の目盛りは既定で整数のみです。件数のグラフに 0.75 のような目盛りは出ません。率や平均を描くときだけ「軸に小数を許す」を入れます。
目盛りの刻みは 1・2・2.5・5・10 の倍数から選ばれます。7.5 のような頭の中で換算できない刻みは出ません。
横棒 — 長いカテゴリ名はこちら
同じデータでも、カテゴリ名が長いなら横棒です。
SELECT 商品カテゴリ, SUM(金額) AS 売上
FROM APP4239
WHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定'
GROUP BY 商品カテゴリ
ORDER BY 売上 DESC
| 設定 | 値 |
|---|---|
| 表示タイプ | 横棒 |
| 値ラベル | オン |
| 値の書式 | 表示スケール 万 / 単位 円 |
横棒のカテゴリ軸は最長ラベルに合わせて自動で広がります(上限はグラフ幅の 40%)。「運用アウトソーシング」のような長い名前でも切れません。px で明示指定もできます。
値ラベルをオンにすると、棒の脇に値が出ます(横棒は右、縦棒は上)。いちばん長い値のぶん余白を作るので、はみ出して切れることはありません。
ドーナツ — 部署別の構成比
SELECT 部署, SUM(金額) AS 売上
FROM APP4239
WHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定'
GROUP BY 部署
ORDER BY 売上 DESC
| 設定 | 値 |
|---|---|
| 表示タイプ | ドーナツ |
| 円のラベル | 割合 |
| ヘッダーに合計 | オン |
| 凡例 | 右 |
ヘッダーに合計を出すと、タイトルの横に総額が出ます。上位 N でまとめていても「その他」を含む全件の合計です — 見えている部分だけの合計にすると総額と食い違って読み違えるためです。
円・ドーナツは既定で上位 8 + その他に集約されます。この例は 6 区分なのでそのまま出ています。
形② X 軸 + 値
折れ線 — 月次の推移
SELECT DATE_FORMAT(売上日, '%Y-%m') AS 年月, SUM(金額) AS 売上
FROM APP4239
WHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定' AND 売上日 <= CURRENT_DATE()
GROUP BY DATE_FORMAT(売上日, '%Y-%m')
ORDER BY 年月
DATE_FORMAT(売上日, '%Y-%m') で年月を作ります。GROUP BY には式をそのまま書きます — 別名(GROUP BY 年月)ではなく式です。
売上日 <= CURRENT_DATE() を足しているのは、未来日付のデータを混ぜないためです(このデモデータには練習用に未来日付が 3 件あります)。
2 系列 — 今年 vs 前年
値の列を 2 本返すと、そのまま 2 系列になります。
WITH 年比較 AS (
SELECT MONTH(売上日) AS 月,
SUM(CASE WHEN YEAR(売上日) = YEAR(CURRENT_DATE()) THEN 金額 ELSE 0 END) AS 今年,
SUM(CASE WHEN YEAR(売上日) = YEAR(CURRENT_DATE()) - 1 THEN 金額 ELSE 0 END) AS 前年
FROM APP4239
WHERE (売上日 = THIS_YEAR() OR 売上日 = LAST_YEAR()) AND 売上ステータス = '確定'
GROUP BY MONTH(売上日)
)
SELECT 月, 今年, 前年
FROM 年比較
WHERE 月 <= MONTH(CURRENT_DATE())
ORDER BY 月
なぜ CTE に分けているのか。 これがこの記事でいちばん引っかかりやすいところです。
WHERE に MONTH(売上日) <= MONTH(CURRENT_DATE()) を直接足すと、エラーになります。
THIS_YEAR: WHERE_RELATIVE_DATE_REQUIRES_EXACT_PUSHDOWN
相対日付関数は、WHERE 全体を kintone のサーバー側へ渡せる形でないと使えません。THIS_YEAR() OR LAST_YEAR() はどちらも渡せるので OK ですが、そこに MONTH() のような渡せない条件を AND で混ぜると、全体として渡せなくなります。
対処は「渡せる条件だけで取ってきて、絞り込みは後段でやる」です。CTE の中は相対日付だけにし、月 <= MONTH(CURRENT_DATE()) は CTE の外に置きます。
ブラウザ側で評価する条件を混ぜてもよい形(prefilter + 残余)もありますが、それは相対日付が
ANDの直下にある場合です。ORの枝に入っていると使えません。
形③ ロング形式 3 列 — 積み上げ
積層棒 — 月次 × 大分類
SELECT DATE_FORMAT(売上日, '%Y-%m') AS 年月, 大分類, SUM(金額) AS 売上
FROM APP4239
WHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定' AND 売上日 <= CURRENT_DATE()
GROUP BY DATE_FORMAT(売上日, '%Y-%m'), 大分類
ORDER BY 年月
| 設定 | 値 |
|---|---|
| 表示タイプ | 積層棒 |
| 列の割り当て → X 軸 | 年月 |
| 列の割り当て → 系列キー | 大分類 |
| 列の割り当て → 値 | 売上 |
この形だけは「列の割り当て」が必須です。
省略するとワイド形式として解釈されます — 1 列目が X 軸、数値列だけが系列になり、大分類 は無視されます。同じ年月の行がそのまま並ぶだけで、積み上がりません。エラーにはならないので気づきにくい失敗です。
系列キーは必ず集計後の少数の値にします。 顧客名のように一意に近い列を系列にすると、系列が行数まで増えます。8 本を超えた分は「その他」へ畳まれるので、意図した絵になりません。
100% 積み上げ — 同じ SQL、オプションだけ違う
SELECT DATE_FORMAT(売上日, '%Y-%m') AS 年月, 大分類, SUM(金額) AS 売上
FROM APP4239
WHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定' AND 売上日 <= CURRENT_DATE()
GROUP BY DATE_FORMAT(売上日, '%Y-%m'), 大分類
ORDER BY 年月
| 設定 | 値 |
|---|---|
| 100% 積み上げ | オン |
| 凡例 | 下 |
SQL は 1 文字も変えていません。金額の大小ではなく構成比の推移を見たいときはこちらです。総額が伸びていても内訳が変わっていない、という読み取りができます。
横積層棒 — 長いカテゴリ名 × 内訳
SELECT 地域, 大分類, SUM(金額) AS 売上
FROM APP4239
WHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定'
GROUP BY 地域, 大分類
ORDER BY 地域
| 設定 | 値 |
|---|---|
| 表示タイプ | 横積層棒 |
| 列の割り当て | X 軸 = 地域 / 系列キー = 大分類 / 値 = 売上 |
| 凡例 | 右 |
「北海道・東北」「甲信越・北陸」のような長いカテゴリ名 × 内訳は、この形がいちばん読みやすくなります。縦の積層棒だと、X 軸のラベルが入りきりません。
形④ X 軸 + 値 2 本以上 — 複合
SELECT DATE_FORMAT(売上日, '%Y-%m') AS 年月, SUM(金額) AS 売上, COUNT(*) AS 件数
FROM APP4239
WHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定' AND 売上日 <= CURRENT_DATE()
GROUP BY DATE_FORMAT(売上日, '%Y-%m')
ORDER BY 年月
| 設定 | 値 |
|---|---|
| 表示タイプ | 複合 |
| 棒にする系列 | 売上 |
| 線にする系列 | 件数 |
| 値ラベル | オン |
| 値の書式(左) | 表示スケール 万 / 単位 円 |
| 値の書式(右) | 単位 件 |
左右の軸は独立して計算されます。全系列の最大で刻むと、棒が売上(数千万)・線が件数(数十)のときに左軸が数千万まで伸びて棒が潰れます。
書式も左右で別々に指定します。右軸は左軸の書式を継承しません。金額(万)と件数を並べるのが本来の用途で、そこでは継承が常に誤りになるからです。継承する作りだと「単位なし」が指定できなくなり、いちばん必要な指定が表現できません。
右にも単位を付けたいときは、右にも指定します。この例では右を「件」にしています。継承していたら件数が「0万」と表示されるところです。
値ラベルは複合では棒の系列にだけ付きます。線にも付けると、棒のラベルと見分けが付かなくなるためです。
見せ方と軸
ここからは同じ SQL でも見え方が変わる設定です。
取引の無い日を 0 で埋める
日次の折れ線で問題になるのが「取引の無い日は行ごと消える」ことです。GROUP BY はデータのある日しか行を作らないので、X 軸から日付が抜けて線が詰まります。
DECLARE @from = DATE_ADD(CURRENT_DATE(), -29, 'DAY');
DECLARE @to = CURRENT_DATE();
WITH 日付系列 AS (
GENERATE_SERIES(@from, @to, '1 day') AS 日付
),
日別 AS (
SELECT 売上日, SUM(金額) AS 売上
FROM APP4239
WHERE 売上日 >= @from AND 売上ステータス = '確定'
GROUP BY 売上日
)
SELECT s.日付, CASE WHEN d.売上 = '' THEN 0 ELSE d.売上 END AS 売上
FROM 日付系列 AS s LEFT JOIN 日別 AS d ON s.日付 = d.売上日
ORDER BY s.日付
GENERATE_SERIES で日付の列を先に作り、そこへ日別の集計を LEFT JOIN します。
引っかかるところが 3 つあります。
① GENERATE_SERIES の引数に式を直接書けません。 DECLARE で変数にしてから渡します。
GENERATE_SERIES の引数には数値、文字列、またはバッチ変数を指定してください
② 相対日付関数は DECLARE に書けません。 THIS_MONTH() などは WHERE 専用です。CURRENT_DATE() と DATE_ADD を使います。WHERE も同じ @from で絞れば、実行時にリテラルへ解決されてサーバー側へ渡ります。
③ LEFT JOIN で一致しなかった日の値は 0 ではなく空文字です。 CASE WHEN … = '' THEN 0 まで書いて初めて 0 埋めになります。
グラフの「欠損値の扱い」オプションでは補えません。あれは既存の行の欠損値をどう見せるかの設定で、行そのものが無い日は作れません。0 埋めは SQL 側の仕事です。
なお、系列の生成はレコードを 1 件も取りません。この
LEFT JOINは「外部結合は取得件数が増えやすい」の例外です。左辺がレコードを持たないので、取得は右辺(集計側)の分だけです。
目標線を引く
SELECT DATE_FORMAT(売上日, '%Y-%m') AS 年月, SUM(金額) AS 売上
FROM APP4239
WHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定' AND 売上日 <= CURRENT_DATE()
GROUP BY DATE_FORMAT(売上日, '%Y-%m')
ORDER BY 年月
| 設定 | 値 |
|---|---|
| 目標線 1 | 値 40000000 / 名前「月次目標」 |
| 目標線 2 | 値 60000000 / 名前「ストレッチ」 |
目標がデータの最大を超えても、軸を伸ばして必ず描きます。 届いていない場面がいちばん見たいところだからです。
線の名前はグラフの上に破線の見本つきで出ます。線の脇に置くと必ずどこかで棒と重なり、棒の値ラベルと見分けが付かなくなるためです。
名前に金額を書かないでください。 注記は「名前 + 値」で組み立てられるので、「月次目標 4,000 万円」と書くと「月次目標 4,000 万円 4,000万円」と二重に出ます。名前は名前だけにします。
上位 N + その他
SELECT 担当者名, SUM(金額) AS 売上
FROM APP4239
WHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定'
GROUP BY 担当者名
ORDER BY 売上 DESC
| 設定 | 値 |
|---|---|
| 上位 N + その他 | 5 |
| 値ラベル | オン |
| ヘッダーに合計 | オン |
12 名を上位 5 + その他にまとめています。「その他」には件数が付きます(その他(7))。1 名を隠しているのか 7 名かで読み方が変わるからです。
- 残りを捨てるのではなく 1 本にまとめます
- グラフの下に「上位 5 件を表示し、残りを『その他(7)』にまとめています」と注記が出ます
- 並びが値の降順になるので、月次のように並びに意味があるグラフでは使いません
値ラベル + ラベルをすべて表示
冒頭の棒グラフ(形①)と同じ SQLで、オプションだけ変えます。
SELECT 商品カテゴリ, COUNT(*) AS 件数
FROM APP4239
WHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定'
GROUP BY 商品カテゴリ
ORDER BY 件数 DESC
| 設定 | 値 |
|---|---|
| 値ラベル | オン |
| ラベルをすべて表示 | オン |
| 値の書式 | 単位 件 |
既定では重なる分のラベルを間引きます。棒はあるのに名前が出ない行ができるので、全部出したいときにこの指定を使います。
入りきらないラベルは水平のまま末尾を … で省略します。傾けません — 斜めの文字は読むのに時間がかかるからです。
単位を軸の端へ + ヘッダーに合計
SELECT 商品カテゴリ, SUM(金額) AS 売上
FROM APP4239
WHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定'
GROUP BY 商品カテゴリ
ORDER BY 売上 DESC
| 設定 | 値 |
|---|---|
| 単位を軸の端へ | オン |
| ヘッダーに合計 | オン |
| ラベルをすべて表示 | オン |
| 値の書式 | 表示スケール 万(単位は付けない) |
目盛りから単位を外し、軸の端に 1 回だけ出します。「20.7百万 / 15.55百万 …」と繰り返すより、軸に「(百万)」と置くほうが読みやすくなります。
この指定が外すのは表示スケール(千・万・百万)だけです。自分で付けた単位(円)は目盛りに残るので、
4,000円と読めてしまいます。この例では単位を付けず、軸に「(万)」だけを出しています。
隣に置いた表で「単位を見出しへ」を使うと、数字の見た目が揃います。
色について
系列の色はテーマ共通の固定パレットで、個別指定はできません。CVD(色覚多様性)を検証済みの 8 色です。
系列が 8 を超えると自動で「その他」へ集約されます。色で見分けられる上限がそこだからです。
- 円・ドーナツ・カテゴリ軸のグラフでは上位 N を指定できます(値の降順で N 件を残す)
- 凡例は2 系列以上で表示されます(1 系列はタイトルが兼ねます)
- 凡例の文字は系列色ではなく文字色で描きます。黄系の色をそのまま文字にすると、白背景でほとんど読めないためです
つまずきポイント
積み上げたのに積み上がらない
「列の割り当て」を省いています。 ロング形式の 3 列は、X 軸・系列キー・値を明示しないとワイド形式として解釈されます。エラーは出ません。
相対日付を混ぜたら拒否された
WHERE_RELATIVE_DATE_REQUIRES_EXACT_PUSHDOWN
THIS_YEAR() OR LAST_YEAR() のような OR の枝に相対日付があるとき、そこへ渡せない条件を AND で足すと全体が拒否されます。絞り込みを CTE の外へ出します(形②の 2 系列)。
GENERATE_SERIES に式を書いて怒られた
引数は数値・文字列・変数だけです。DECLARE で先に変数へ入れます。
0 埋めしたのに線が途切れる
LEFT JOIN の未一致は 0 ではなく空文字です。CASE WHEN … = '' THEN 0 まで書きます。
目標線の名前が二重に出る
注記は「名前 + 値」で組み立てられます。名前に金額を書かないでください。
複合グラフの右軸が「0万」になる
右軸は左軸の書式を継承しません。右にも書式を指定します。
まとめ
グラフで押さえるのは 3 つです。
- SQL の形は 4 通り — ①ラベル + 値 ②X 軸 + 値 ③ロング形式 3 列 ④X 軸 + 値 2 本以上。9 種類を別々に覚える必要はありません
- 形③だけ「列の割り当て」が要る — 省くと積み上がらないのにエラーも出ません
- 同じ SQL でも、オプションで見え方が変わる — 100% 積み上げ、値ラベル、上位 N、目標線、単位の置き場
種類から入ると 9 通りに見えますが、形から入れば 4 通りです。作りたい絵が決まったら、まず「どの形で返すか」を決めてください。
関連記事
- ⓪ 準備編 — デモアプリを 15 分で用意する
- ① KPI カード — 数字 1 つを、意味のある 1 つに
- ② データ表 — 明細も集計もこれ 1 つ
- ④ マークダウン — 数字を、文章に埋める
- kSQL Dashboard Pro 製品紹介 — 表示タイプ・設定画面・テーマなど機能全般
- SFA パック編 / 在庫管理パック編 — 業務アプリに実際に組んだ例
- rex0220 kSQL 言語リファレンス — SQL の文法。プラグインで使えるのは読み取り系だけです
付録 — 配布ファイル
GitHub に一式を置いています
アプリテンプレート・データ投入スクリプト・設定 JSON をまとめてあります。
https://github.com/rex0220/ksql-dashboard-pro-demo
設定はまとめて 1 回で取り込めます。 settings/型別-全一覧-見本.json に 5 一覧・43 ペイン(連載 4 本ぶん + 4 型を組み合わせた見本)が入っています。この記事のぶんだけでよければ、下の JSON を使ってください。
**アプリの用意とデータの入れ方は ⓪ 準備編**にまとめてあります。4 本とも同じアプリを使うので、一度作れば全部動きます。
設定 JSON(この記事の 3 タブ 14 ペイン)
GitHub の settings/型別-グラフ-見本.json と同じものです。コピーして使えるよう全文を貼ります。
- 折りたたみを開き、コードブロック右上のコピーボタンでコピー
- テキストエディター(メモ帳等)に貼り付け、
型別-グラフ-見本.jsonとして保存(文字コード UTF-8) - 設定画面の ツール → インポート でそのファイルを選択
SQL 中の
APP4239などは、取り込み時の確認ダイアログ「アプリ番号の変換」でご自身の環境の番号へ変換できます(JSON を手で書き換える必要はありません)。
型別-グラフ-見本.json — 3 タブ 14 ペイン
{
"date": "2026-08-15 00:00:00",
"pluginName": "kSQL Dashboard Pro",
"pluginVersion": "1",
"engineVersion": "3.66.1",
"appId": 4239,
"appName": "売上明細",
"sqlApps": [
{
"appId": 4239,
"appName": "売上明細"
}
],
"config": {
"schemaVersion": 2,
"edition": "pro",
"views": {
"13335809": {
"name": "グラフの見本",
"viewName": "【型別】グラフ",
"layout": [],
"panes": [],
"tabs": [
{
"id": "tab1",
"name": "①ラベル+値 ②X軸+値",
"layout": [
{
"i": "pane1",
"x": 0,
"y": 0,
"w": 20,
"h": 6
},
{
"i": "pane2",
"x": 20,
"y": 0,
"w": 20,
"h": 6
},
{
"i": "pane3",
"x": 40,
"y": 0,
"w": 20,
"h": 6
},
{
"i": "pane4",
"x": 0,
"y": 6,
"w": 30,
"h": 6
},
{
"i": "pane5",
"x": 30,
"y": 6,
"w": 30,
"h": 6
}
],
"panes": [
{
"id": "pane1",
"type": "bar",
"title": "形① ラベル + 値 — 商品カテゴリ別の件数",
"sql": "SELECT 商品カテゴリ, COUNT(*) AS 件数\nFROM APP4239\nWHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定'\nGROUP BY 商品カテゴリ\nORDER BY 件数 DESC"
},
{
"id": "pane2",
"type": "barH",
"title": "形① 横棒 — 長いカテゴリ名はこちら",
"sql": "SELECT 商品カテゴリ, SUM(金額) AS 売上\nFROM APP4239\nWHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定'\nGROUP BY 商品カテゴリ\nORDER BY 売上 DESC",
"options": {
"valueLabels": true,
"valueFormat": {
"scale": "man",
"suffix": "円",
"decimals": 0
}
}
},
{
"id": "pane3",
"type": "donut",
"title": "形① ドーナツ — 部署別の構成比",
"sql": "SELECT 部署, SUM(金額) AS 売上\nFROM APP4239\nWHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定'\nGROUP BY 部署\nORDER BY 売上 DESC",
"options": {
"pieLabels": "percent",
"showTotal": true,
"legend": "right",
"valueFormat": {
"scale": "man",
"suffix": "円",
"decimals": 0
}
}
},
{
"id": "pane4",
"type": "line",
"title": "形② X 軸 + 値 — 月次の推移",
"sql": "SELECT DATE_FORMAT(売上日, '%Y-%m') AS 年月, SUM(金額) AS 売上\nFROM APP4239\nWHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定' AND 売上日 <= CURRENT_DATE()\nGROUP BY DATE_FORMAT(売上日, '%Y-%m')\nORDER BY 年月",
"options": {
"valueFormat": {
"scale": "man",
"suffix": "円",
"decimals": 0
}
}
},
{
"id": "pane5",
"type": "line",
"title": "形② 2 系列 — 今年 vs 前年",
"sql": "/* 相対日付は WHERE 全体が押し下げできる形でないと使えない。\n MONTH() での絞り込みを AND で混ぜると拒否されるので、CTE の外へ出す */\nWITH 年比較 AS (\n SELECT MONTH(売上日) AS 月,\n SUM(CASE WHEN YEAR(売上日) = YEAR(CURRENT_DATE()) THEN 金額 ELSE 0 END) AS 今年,\n SUM(CASE WHEN YEAR(売上日) = YEAR(CURRENT_DATE()) - 1 THEN 金額 ELSE 0 END) AS 前年\n FROM APP4239\n WHERE (売上日 = THIS_YEAR() OR 売上日 = LAST_YEAR()) AND 売上ステータス = '確定'\n GROUP BY MONTH(売上日)\n)\nSELECT 月, 今年, 前年\nFROM 年比較\nWHERE 月 <= MONTH(CURRENT_DATE())\nORDER BY 月",
"options": {
"valueFormat": {
"scale": "man",
"suffix": "円",
"decimals": 0
}
}
}
]
},
{
"id": "tab2",
"name": "③ロング形式 ④値2本以上",
"layout": [
{
"i": "pane6",
"x": 0,
"y": 0,
"w": 30,
"h": 6
},
{
"i": "pane12",
"x": 30,
"y": 0,
"w": 30,
"h": 6
},
{
"i": "pane7",
"x": 0,
"y": 6,
"w": 30,
"h": 6
},
{
"i": "pane14",
"x": 30,
"y": 6,
"w": 30,
"h": 6
}
],
"panes": [
{
"id": "pane6",
"type": "barStacked",
"title": "形③ ロング形式 3 列 — 月次 × 大分類(mapping が要る)",
"sql": "SELECT DATE_FORMAT(売上日, '%Y-%m') AS 年月, 大分類, SUM(金額) AS 売上\nFROM APP4239\nWHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定' AND 売上日 <= CURRENT_DATE()\nGROUP BY DATE_FORMAT(売上日, '%Y-%m'), 大分類\nORDER BY 年月",
"options": {
"mapping": {
"x": "年月",
"seriesKey": "大分類",
"value": "売上"
},
"valueFormat": {
"scale": "man",
"suffix": "円",
"decimals": 0
}
}
},
{
"id": "pane12",
"type": "barStacked",
"title": "100% 積み上げ(pane6 と同じ SQL)",
"sql": "SELECT DATE_FORMAT(売上日, '%Y-%m') AS 年月, 大分類, SUM(金額) AS 売上\nFROM APP4239\nWHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定' AND 売上日 <= CURRENT_DATE()\nGROUP BY DATE_FORMAT(売上日, '%Y-%m'), 大分類\nORDER BY 年月",
"options": {
"mapping": {
"x": "年月",
"seriesKey": "大分類",
"value": "売上"
},
"stackPercent": true,
"legend": "bottom"
}
},
{
"id": "pane7",
"type": "combo",
"title": "形④ X 軸 + 値 2 本以上 — 売上(棒)と件数(線)",
"sql": "SELECT DATE_FORMAT(売上日, '%Y-%m') AS 年月, SUM(金額) AS 売上, COUNT(*) AS 件数\nFROM APP4239\nWHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定' AND 売上日 <= CURRENT_DATE()\nGROUP BY DATE_FORMAT(売上日, '%Y-%m')\nORDER BY 年月",
"options": {
"bars": [
"売上"
],
"lines": [
"件数"
],
"valueLabels": true,
"valueFormat": {
"scale": "man",
"suffix": "円",
"decimals": 0
},
"valueFormatRight": {
"suffix": "件",
"decimals": 0
}
}
},
{
"id": "pane14",
"type": "barHStacked",
"title": "横積み上げ棒 — 地域別 × 大分類(長いカテゴリ名 × 内訳)",
"sql": "SELECT 地域, 大分類, SUM(金額) AS 売上\nFROM APP4239\nWHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定'\nGROUP BY 地域, 大分類\nORDER BY 地域",
"options": {
"mapping": {
"x": "地域",
"seriesKey": "大分類",
"value": "売上"
},
"legend": "right",
"valueFormat": {
"scale": "man",
"suffix": "円",
"decimals": 0
}
}
}
]
},
{
"id": "tab3",
"name": "見せ方と軸",
"layout": [
{
"i": "pane8",
"x": 0,
"y": 0,
"w": 30,
"h": 6
},
{
"i": "pane10",
"x": 30,
"y": 0,
"w": 30,
"h": 6
},
{
"i": "pane9",
"x": 0,
"y": 6,
"w": 20,
"h": 6
},
{
"i": "pane11",
"x": 20,
"y": 6,
"w": 20,
"h": 6
},
{
"i": "pane13",
"x": 40,
"y": 6,
"w": 20,
"h": 6
}
],
"panes": [
{
"id": "pane8",
"type": "line",
"title": "取引の無い日を 0 で埋める(GENERATE_SERIES)",
"sql": "/* 相対日付関数は DECLARE に書けない。CURRENT_DATE() + DATE_ADD を使う */\nDECLARE @from = DATE_ADD(CURRENT_DATE(), -29, 'DAY');\nDECLARE @to = CURRENT_DATE();\nWITH 日付系列 AS (\n GENERATE_SERIES(@from, @to, '1 day') AS 日付\n),\n日別 AS (\n SELECT 売上日, SUM(金額) AS 売上\n FROM APP4239\n WHERE 売上日 >= @from AND 売上ステータス = '確定'\n GROUP BY 売上日\n)\n/* LEFT JOIN で一致しない日は 0 ではなく空文字。CASE まで書いて初めて 0 埋めになる */\nSELECT s.日付, CASE WHEN d.売上 = '' THEN 0 ELSE d.売上 END AS 売上\nFROM 日付系列 AS s LEFT JOIN 日別 AS d ON s.日付 = d.売上日\nORDER BY s.日付",
"options": {
"valueFormat": {
"scale": "man",
"suffix": "円",
"decimals": 0
}
}
},
{
"id": "pane10",
"type": "bar",
"title": "目標線を引く(データの最大を超えても必ず描く)",
"sql": "SELECT DATE_FORMAT(売上日, '%Y-%m') AS 年月, SUM(金額) AS 売上\nFROM APP4239\nWHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定' AND 売上日 <= CURRENT_DATE()\nGROUP BY DATE_FORMAT(売上日, '%Y-%m')\nORDER BY 年月",
"options": {
"refLines": [
{
"value": 40000000,
"label": "月次目標"
},
{
"value": 60000000,
"label": "ストレッチ"
}
],
"valueFormat": {
"scale": "man",
"suffix": "円",
"decimals": 0
}
}
},
{
"id": "pane9",
"type": "barH",
"title": "上位 5 +「その他」(件数が付く)",
"sql": "SELECT 担当者名, SUM(金額) AS 売上\nFROM APP4239\nWHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定'\nGROUP BY 担当者名\nORDER BY 売上 DESC",
"options": {
"topN": 5,
"valueLabels": true,
"showTotal": true,
"valueFormat": {
"scale": "man",
"suffix": "円",
"decimals": 0
}
}
},
{
"id": "pane11",
"type": "bar",
"title": "値ラベル + ラベルをすべて表示(pane1 と同じ SQL)",
"sql": "SELECT 商品カテゴリ, COUNT(*) AS 件数\nFROM APP4239\nWHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定'\nGROUP BY 商品カテゴリ\nORDER BY 件数 DESC",
"options": {
"valueLabels": true,
"xLabelsAll": true,
"valueFormat": {
"suffix": "件",
"decimals": 0
}
}
},
{
"id": "pane13",
"type": "bar",
"title": "単位を軸の端へ + ヘッダーに合計",
"sql": "SELECT 商品カテゴリ, SUM(金額) AS 売上\nFROM APP4239\nWHERE 売上日 = THIS_YEAR() AND 売上ステータス = '確定'\nGROUP BY 商品カテゴリ\nORDER BY 売上 DESC",
"options": {
"unitOnAxis": true,
"showTotal": true,
"xLabelsAll": true,
"valueFormat": {
"scale": "man",
"decimals": 0
}
}
}
]
}
]
}
},
"common": {}
}
}

















