2026年5月13日水曜日

ローカル環境で実行しているHermes AgentからOracle Databaseに問い合わせて販売分析を行う

Nous Research社が開発しているHermes Agentより、MCPサーバー経由でOracle Databaseに問い合わせ、スキルを使って販売分析を実行してみます。

Hermes Agentの使い方や機能についての解説ではなく、Hermes AgentからOracle Databaseへ問い合わせる設定や、スキルが適用できるかどうかを確認しています。Hermes Agent自体の紹介は、他の記事を参照されることをお勧めします。ソフトウェアの構成としては比較的シンプルだと感じますが、それでも色々な機能が実装されているようです。特にOpenClawはオーバースペックと感じる方には向いていると思います。

作業環境にMacbook Proを使用します。エージェントが問い合わせるLLMをLM Studioで実行することにより、すべてローカルで作業を完結させます。Oracle DatabaseもローカルのDocker+Colimaで実行します。

Hermes AgentもOracle Databaseを実行するために用意しているDocker+Colimaで、コンテナとして実行します。

作業環境の構築については、以下の記事を参照してください。

Oracle DatabaseのコンテナをローカルのmacOSで実行する手順
- United CodesのUC Local APEX Devを使ってOracle APEXのローカル開発環境を作成する
サンプル・スキーマに含まれるSH(Sales History)のインストール手順
- アップデートされたサンプル・スキーマのインストール
Oracle DatabaseへのリモートMCPサーバーの実装手順
- MCPを話すOracle Databaseを作成する - ローカル・データベース編
Microsoft APMを使用したAgent Skillsの管理について
- Claude CodeおよびOpenAI CodexでAgent Skillsを参照しMCPサーバー経由でOracle Databaseに問い合わせる

本記事ではLM Studioにロードしたモデルmlx-community/gpt-oss-120bを呼び出します。Hermes Agentが対応していれば、他のプロバイダとモデルの組み合わせも使用できます。

Oracle Databaseについては、ORDSとAPEXがインストールされていること、サンプル・スキーマのSH(Sales History)がインストールされていること、リモートMCPサーバーのサンプルsampleserverが実装されていることが条件です。リモートMCPサーバーの保護については、ORDSのOAuthで保護するため、Microsoft Entra IDなどOpen ID Connect認証の準備やリバース・プロキシの実装は不要です。

最初に準備済みの環境を確認します。

ORDSやAPEXを実行するローカル環境は、ベルギーのUnited Codes社が提供しているuc-local-apex-devを使って作成しています。この環境で以下の作業が完了していることを確認します。
  1. APEXのワークスペースとしてAPEXDEV、デフォルト・パーシング・スキーマとしてAPEXDEVが作成されている。
  2. サンプル・スキーマSHがインストールされ、スキーマAPEXDEVからすべての表が検索可能になっている。
  3. リモートMCPサーバーのサンプルsampleserverが実装されている。リモートMCPサーバーの実装はリポジトリmcp-appにあります。
手元のPCで作業ディレクトリとしてhermes-agentを作成し、作成したディレクトリに移動します。

mkdir hermes-agent
cd hermes-agent

% mkdir hermes-agent

% cd hermes-agent

hermes-agent % 


MCP Inspectorを起動し、ローカルのOracle Databaseに実装されているリモートMCPサーバー経由でSales Historyの表を検索できることを確認します。ユーザー認証による保護は外しておきます。

npx @modelcontextprotocol/inspector

Transport TypeStreamable HTTPを選択し、URLに以下を指定します。接続先がAutonomous AI Databaseの場合はユーザー認証による保護を外した上で、リバース・プロキシを介さず、直接Autonomous AI DatabaseのORDSを指すようにします。

http://localhost:8181/ords/apexdev/sampleserver/mcp

上記を設定し、Connectをクリックします。


リモートMCPサーバーのsampleserverに接続されることを確認し、Toolsタブを開きます。

List Toolsを実行し、一覧されたツールからrun_sqlを選択します。


ツールrun_sqlが受け付けるパラメータsqlに、以下を記述します。サンプル・スキーマSHがインストールされていてアクセス権があれば、SH.CUSTOMERSの内容が検索できます。

select * from sh.customers

Run Toolをクリックします。Tool ResultSuccessで、検索結果がJSONドキュメントとして表示されていれば、Oracle Databaseの準備はできています。


動作検証なので、このまま認証なしでHermes AgentからOracle Databaseにアクセスしてもよいのですが、ORDSのOAuthの機能を使って最低限の保護をかけることにします。

以下のスクリプトoauth-protect.sqlを実行し、ORDSモジュールsampleserverをOAuthユーザーhermes_clientで保護します。ロールhermes_roleおよび権限hermes.privも作成します。

アクセス・トークンのデフォルトの有効期間は3600(1時間)です。エージェントからの接続としては短いため、ords_security.register_clientの引数p_token_durationに86400(24時間)を指定しています。

データベースにAPEXワークスペースのデフォルト・パーシング・スキーマで接続し、実行します。今回の作業ではデータベース・ユーザーAPEXDEVで接続します。UC Local APEX Devにて作成した環境であれば、SQLclの接続としてlocal-26ai-apexdevが登録されています。

sql -name local-26ai-apexdev @oauth-protect.sql

hermes-agent % sql -name local-26ai-apexdev @oauth-protect.sql


SQLcl: 水 5月 13 16:11:33 2026のリリース26.1 Production


Copyright (c) 1982, 2026, Oracle.  All rights reserved.


接続先:

Oracle AI Database 26ai Free Release 23.26.1.0.0 - Develop, Learn, and Run for Free

Version 23.26.1.0.0


Role hermes_role is created.

Privilege hermes.priv is created.

OAuth client hermes_client is created.

client_id: x6rMRze6ipnL7aM_u8IURA..

client_secret: l2fgQCVtKUQSCAENMZ-cQg..

Role hermes_role has granted to OAuth user hermes_client.

OS command to execute in order to obtain an access token.

export ORDS_OAUTH_CLIENT_ID="x6rMRze6ipnL7aM_u8IURA.."

export ORDS_OAUTH_CLIENT_SECRET="l2fgQCVtKUQSCAENMZ-cQg.."

curl -u ${ORDS_OAUTH_CLIENT_ID}:${ORDS_OAUTH_CLIENT_SECRET} --data "grant_type=client_credentials" http://localhost:8181/ords/apexdev/oauth/token



PL/SQLプロシージャが正常に完了しました。


Oracle AI Database 26ai Free Release 23.26.1.0.0 - Develop, Learn, and Run for Free

Version 23.26.1.0.0から切断されました

hermes-agent % 


OAuthクライアントとしてhermes_clientが作成され、ORDSモジュールsampleserverが保護されます。

クライアントhermes_clientclient_idおよびclient_secretが出力されています。OS command to execute in order to obtain an access token.以下の3行を実行します。

出力されているclient_secretは、oauth-protect.sqlを実行するたびに更新されます。curlコマンドでアクセスしているURLは、ローカルで動作しているOAuthのトークンURL(URLの末尾が/oauth/token)を指しています。Autonomous AI Databaseなど、接続先が異なる場合は変更します。

hermes-agent % export ORDS_OAUTH_CLIENT_ID="x6rMRze6ipnL7aM_u8IURA.."

export ORDS_OAUTH_CLIENT_SECRET="l2fgQCVtKUQSCAENMZ-cQg.."

curl -u ${ORDS_OAUTH_CLIENT_ID}:${ORDS_OAUTH_CLIENT_SECRET} --data "grant_type=client_credentials" http://localhost:8181/ords/apexdev/oauth/token

{"access_token":"vnGN5uQ_y-DEh7r58PDzeA","token_type":"bearer","expires_in":86400}                           hermes-agent % 


curlコマンドの結果としてアクセス・トークンが返されます。このアクセス・トークンを環境変数ORDS_OAUTH_ACCESS_TOKENに設定します。アクセス・トークンの値は、curlコマンドの実行の度に変わります。

export ORDS_OAUTH_ACCESS_TOKEN="vnGN5uQ_y-DEh7r58PDzeA"

hermes-agent % export ORDS_OAUTH_ACCESS_TOKEN="vnGN5uQ_y-DEh7r58PDzeA"

hermes-agent % 


再度MCP Inspectorを起動し、アクセス・トークンが有効化どうか確認します。

先ほどと同じ設定でConnectをクリックすると、Connection Errorが発生します。


Authenticationを開き、Custom Headersとして、Authorizationを追加します。ヘッダーの値はBearer アクセス・トークンBearerで始まり空白で区切りアクセス・トークンを記述する)になります。

Connectをクリックします。 接続が成功すれば、ORDSのOAuthにより、リモートMCPサーバーが保護されていることになります。


Oracle Databaseの準備ができたので、Hermes Agentを構成します。

Hermes AgentのDockerでの構成について、以下に記載されています。


今回はすでに作成している作業ディレクトリを、Hermes Agentのデータ・ディレクトリとします。チャットについては、コンテナ内で実行しているHermes Agentと、標準入出力で繋いで会話するようにします。

以下のコマンドを実行します。

ホスト側で環境変数ORDS_OAUTH_ACCESS_TOKENとして設定されているアクセス・トークンを、コンテナにも同じ環境変数の値として渡しています。
docker run -it --rm \
-e ORDS_OAUTH_ACCESS_TOKEN=${ORDS_OAUTH_ACCESS_TOKEN} \
-v ${PWD}:/opt/data \
nousresearch/hermes-agent setup
Hermes Agentをコンテナで実行する場合、最初の引数はhermesコマンドの最初の引数になります。最初なのでsetupを実行します。

Hermes Agentのセットアップが始まります。

Quick setupを選択します。

How would you like to set up Hermes?

  ↑↓ navigate  ENTER/SPACE select  ESC cancel


   (●) Quick setup — provider, model & messaging (recommended)

 → (○) Full setup — configure everything


ProviderとしてLM Studioを選択します。

Select provider:

  ↑↓ navigate  ENTER/SPACE select  ESC cancel


   (●) Nous Portal (Nous Research subscription)

   (○) OpenRouter (100+ models, pay-per-use)

 → (○) LM Studio (local desktop app with built-in model server)

   (○) Anthropic (Claude models — API key or Claude Code)

   (○) OpenAI Codex

   (○) Xiaomi MiMo (MiMo-V2.5 and V2 models — pro, omni, flash)

   (○) Tencent TokenHub (Hy3 Preview — direct API via tokenhub.tencentmaas.com)

   (○) NVIDIA NIM (Nemotron models — build.nvidia.com or local NIM)

   (○) Qwen OAuth (reuses local Qwen CLI login)

   (○) GitHub Copilot (uses GITHUB_TOKEN or gh auth token)

   (○) GitHub Copilot ACP (spawns `copilot --acp --stdio`)

   (○) Hugging Face Inference Providers (20+ open models)

   (○) Google AI Studio (Gemini models — native Gemini API)

   (○) Google Gemini via OAuth + Code Assist (free tier supported; no API key n

   (○) DeepSeek (DeepSeek-V3, R1, coder — direct API)

   (○) xAI (Grok models — direct API)

   (○) Z.AI / GLM (Zhipu AI direct API)

   (○) Kimi Coding Plan (api.kimi.com) & Moonshot API

   (○) Kimi / Moonshot China (Moonshot CN direct API)

   (○) StepFun Step Plan (agent/coding models via Step Plan API)

   (○) MiniMax (global direct API)

   (○) MiniMax via OAuth browser login (Coding Plan, minimax.io)

   (○) MiniMax China (domestic direct API)

   (○) Alibaba Cloud / DashScope Coding (Qwen + multi-provider)

   (○) Ollama Cloud (cloud-hosted open models — ollama.com)

   (○) Arcee AI (Trinity models — direct API)

   (○) GMI Cloud (multi-model direct API)

   (○) Kilo Code (Kilo Gateway API)

   (○) OpenCode Zen (35+ curated models, pay-as-you-go)

   (○) OpenCode Go (open models, $10/month subscription)

   (○) AWS Bedrock (Claude, Nova, Llama, DeepSeek — IAM or API key)

   (○) Azure Foundry (OpenAI-style or Anthropic-style endpoint — your Azure AI

   (○) Vercel AI Gateway

   (○) Alibaba Cloud Coding Plan — dedicated coding tier

   (○) custom (direct API)

   (○) Custom endpoint (enter URL manually)

   (○) Configure auxiliary models...

   (○) Leave unchanged


LM StudioにAPIキーは不要なので、デフォルトのままEnterキーを入力します。

No LM Studio API key configured.

LM_API_KEY (Enter for no-auth default 'dummy-lm-api-key'): 


LM Studioのエンドポイントはコンテナの外なので、http://host.docker.internal:1234/v1を指定します。(LM Studioのローカル・サーバーがポート1234で待ち受けしている場合)。

Base URL [http://127.0.0.1:1234/v1]: http://host.docker.internal:1234/v1


ダウンロード済みのモデルが一覧されます。この中のmlx-community/gpt-oss-120bを選択しています。ホストのメモリがそれほど潤沢でない場合、選択肢としてQwen系列も悪くないかもしれません。

  Found 24 model(s) from LM Studio

Select default model:                                                           

     google/gemma-4-31b                                                         

     baai_robobrain2.0-7b@q6_k                                                  

     baai_robobrain2.0-7b@q6_k_l                                                

     baai_robobrain2.0-7b@bf16                                                  

->   mlx-community/gpt-oss-120b                                                 

     gemma-3n-e4b-it-mlx@bf16                                                   

     unsloth/gpt-oss-120b                                                       

     openai/gpt-oss-20b                                                         

     openai/gpt-oss-120b                                                        

     qwen/qwen3-30b-a3b-2507                                                    

     gemma-3n-e4b-it-mlx@8bit                                                   

     llm-jp-3-8x13b-instruct3                                                   

     qwen/qwen2.5-vl-7b                                                         

     qwen3-30b-a3b-mlx@4bit                                                     

     qwen3-30b-a3b-mlx@8bit                                                     

     gemma-3-27b-it-qat                                                         

     gemma-3-27b-it                                                             

     phi-4-mini-instruct@4bit                                                   

     phi-4@8bit                                                                 

     phi-4@4bit                                                                 

     gemma-2-27b-it                                                             

     phi-4-mini-instruct@8bit                                                   

     unsloth-phi-4                                                              

     lmstudio-community/phi-4                                                   

     Enter custom model name                                                    

     Skip (keep current)                                                        


Hermes Agentはコンテナで実行していますが、ユーザー・インターフェース自体もコンテナで実行しています。そのため、terminal backendの選択はlocalになります。

Keep current (local)のまま、次へ進みます。

Select terminal backend:

  ↑↓ navigate  ENTER/SPACE select  ESC cancel


   (○) Local - run directly on this machine (default)

   (○) Docker - isolated container with configurable resources

   (○) Modal - serverless cloud sandbox

   (○) SSH - run on a remote machine

   (○) Daytona - persistent cloud development environment

   (○) Vercel Sandbox - cloud microVM with snapshot filesystem persistence

   (○) Singularity/Apptainer - HPC-friendly container

 → (●) Keep current (local)


messaging platformへの接続を求められます。今回はTelegramやDiscord(Slackなども含む)といったチャット・ツールからの利用は考えていないので、スキップします。

Connect a messaging platform? (Telegram, Discord, etc.)

  ↑↓ navigate  ENTER/SPACE select  ESC cancel


   (●) Set up messaging now (recommended)

 → (○) Skip — set up later with 'hermes setup gateway'


色々と構成が実行され、最終的に構成が完了します。設定ファイルconfig.yamlを直接編集して設定を追加するため、setupはここで終了します。

────────────────────────────────────────────────────────────


🚀 Ready to go!


   hermes              Start chatting

   hermes gateway      Start messaging gateway

   hermes doctor       Check for issues



Launch hermes chat now? [Y/n]: n

hermes-agent % 


記事「Claude CodeおよびOpenAI CodexでAgent Skillsを参照しMCPサーバー経由でOracle Databaseに問い合わせる」にて作成しているAgent Skillsを、作業ディレクトリにダウンロードします。

git clone https://github.com/ujnak/sh-sales-analysis.git

hermes-agent % git clone https://github.com/ujnak/sh-sales-analysis.git


Cloning into 'sh-sales-analysis'...

remote: Enumerating objects: 28, done.

remote: Counting objects: 100% (28/28), done.

remote: Compressing objects: 100% (21/21), done.

remote: Total 28 (delta 3), reused 27 (delta 2), pack-reused 0 (from 0)

Receiving objects: 100% (28/28), 10.77 KiB | 5.39 MiB/s, done.

Resolving deltas: 100% (3/3), done.

hermes-agent % 


このDockerコンテナで動作するHermes Agentが、Agent Skillsを参照するように設定します。

デフォルトではconfig.yamlのskillsは、以下のように記載されていました。

skills:

  external_dirs: []

  template_vars: true

  inline_shell: false

  inline_shell_timeout: 10

  guard_agent_created: false

  creation_nudge_interval: 15


external_dirsとして、/opt/data/sh-sales-analysis/.apm/skillsを追加します。ホスト上の作業ディレクトリは、コンテナから見ると/opt/data以下にマップされています。

skills:

  external_dirs: 

    - /opt/data/sh-sales-analysis/.apm/skills

  template_vars: true

  inline_shell: false

  inline_shell_timeout: 10

  guard_agent_created: false 

  creation_nudge_interval: 15


SOUL.mdとしてsh-sales-analysis/.apm/instructions/sh-schema.instructions.mdを参照するようにします。デフォルトのSOUL.mdはコメントのみでしたが、一応バックアップを取ります。Hermes Agentが動作しているコンテナからは、作業ディレクトリが/opt/dataとして見えることに注意が必要です。

mv SOUL.md SOUL.md.bak
ln -s ./sh-sales-analysis/.apm/instructions/sh-schema.instructions.md SOUL.md

hermes-agent % mv SOUL.md SOUL.md.bak

ynakakoshi@Ns-Macbook hermes-agent % ln -s ./sh-sales-analysis/.apm/instructions/sh-schema.instructions.md SOUL.md

hermes-agent %


リモートMCPサーバーを設定します。config.yamlに以下の設定を追加します。デフォルトではmcp_serversの設定は含まれていなかったので、ファイルの末尾に追加しました。
mcp_servers:
  ords-sampleserver:
    url: "http://host.docker.internal:8181/ords/apexdev/sampleserver/mcp"
    headers:
      Authorization: "Bearer ${ORDS_OAUTH_ACCESS_TOKEN}"
    enabled: true
    timeout: 120
    connect_timeout: 60
    tools:
      include: [ "get_schema", "run_sql", "get_current_user" ]
      resources: false
      prompts: false
config.yamlの末尾に記述されているコメント文の前に、mcp_serversの設定を挿入しています。

mcp_servers:

  ords-sampleserver:

    url: "http://host.docker.internal:8181/ords/apexdev/sampleserver/mcp"

    headers:

      Authorization: "Bearer ${ORDS_OAUTH_ACCESS_TOKEN}"

    enabled: true

    timeout: 120

    connect_timeout: 60

    tools:

      include: [ "get_schema", "run_sql", "get_current_user" ]

      resources: false

      prompts: false


# ── Fallback Model ────────────────────────────────────────────────────

# Automatic provider failover when primary is unavailable.

# Uncomment and configure to enable. Triggers on rate limits (429),

# overload (529), service errors (503), or connection failures.

#


以上でAgent SkillsとリモートMCPサーバーの設定は完了です。

Hermes Agentを再度起動します。今度はsetupではなくchatコマンドを実行します。引数を与えなければ、chatが起動します。
docker run -it --rm \
-e ORDS_OAUTH_ACCESS_TOKEN=${ORDS_OAUTH_ACCESS_TOKEN} \
-v ${PWD}:/opt/data \
nousresearch/hermes-agent
Hermes AgentとのChatが開始します。

最初にAgent Skillsが認識されているかどうかを確認します。

/skills list --source local --enabled-only

custom-analysis、ranking、sales-analysis、trendがリストされます。Skillsは認識されているようです。


Hermes Agentのconfig.yamlに設定しているMCPサーバーは、起動時にメッセージに含まれています。確認に使用できるコマンドは見つけることができませんでした。


後は、Hermes Agentとチャットして動作を確認します。

「mcpサーバーのords-sampleserverのツールget_schemaを呼び出して、スキーマSHの情報を表示して。」

────────────────────────────────────────

mcpサーバーのords-sampleserverのツールget_schemaを呼び出して、スキーマSHの情報を表示して。

────────────────────────────────────────


  ┊ ⚡ preparing mcp_ords_sampleserver_get_schema…

  ┊ ⚡ mcp_ords_   0.1s


╭─ ⚕ Hermes ────────────────────────────────────────────────────────────────────────────────────────╮

    Oracle SH スキーマ概要  

    (取得元: mcp_ords_sampleserver_get_schema)

    

    カテゴリ: ファクト

    テーブル名: SH.SALES

    主なカラム (抜粋): PROD_ID, CUST_ID, TIME_ID, CHANNEL_ID, PROMO_ID, QUANTITY_SOLD, AMOUNT_SOLD

    コメント: 売上トランザクションの中心。すべての分析はここから開始

    ────────────────────────────────────────

    カテゴリ:

    テーブル名: SH.COSTS

    主なカラム (抜粋): PROD_ID, UNIT_PRICE, UNIT_COST, CHANNEL_ID, PROMO_ID, TIME_ID

    コメント: 商品コスト。粗利計算に必須

    ────────────────────────────────────────

    カテゴリ:

    テーブル名: SH.PROFITS

    主なカラム (抜粋): CHANNEL_ID, TOTAL_COST, QUANTITY_SOLD, AMOUNT_SOLD, UNIT_PRICE, UNIT_COST,

      TIME_ID, PROMO_ID, PROD_ID, CUST_ID

    コメント: 売上・コストを結合したビュー的テーブル(分析で便利)

    ────────────────────────────────────────

    カテゴリ: ディメンション

    テーブル名: SH.PRODUCTS

    主なカラム (抜粋): PROD_ID, PROD_NAME, PROD_DESC, PROD_CATEGORY, PROD_SUBCATEGORY,

      PROD_LIST_PRICE

    コメント: 商品情報・カテゴリ階層

    ────────────────────────────────────────

    カテゴリ:

    テーブル名: SH.CUSTOMERS

    主なカラム (抜粋): CUST_ID, CUST_FIRST_NAME, CUST_LAST_NAME, COUNTRY_ID, CUST_INCOME_LEVEL,

      CUST_CREDIT_LIMIT

    コメント: 顧客属性

    ────────────────────────────────────────

    カテゴリ:

    テーブル名: SH.TIMES

    主なカラム (抜粋): TIME_ID, CALENDAR_MONTH_DESC, FISCAL_YEAR, FISCAL_QUARTER_DESC,

      WEEK_ENDING_DAY

    コメント: 日付・会計情報

    ────────────────────────────────────────

    カテゴリ:

    テーブル名: SH.CHANNELS

    主なカラム (抜粋): CHANNEL_ID, CHANNEL_DESC, CHANNEL_CLASS, CHANNEL_TOTAL

    コメント: 販売チャネル

    ────────────────────────────────────────

    カテゴリ:

    テーブル名: SH.PROMOTIONS

    主なカラム (抜粋): PROMO_ID, PROMO_NAME, PROMO_BEGIN_DATE, PROMO_END_DATE, PROMO_COST

    コメント: プロモーション情報 (PROMO_ID=999 は「なし」)

    ────────────────────────────────────────

    カテゴリ: 補助テーブル

    テーブル名: SH.COUNTRIES

    主なカラム (抜粋): COUNTRY_ID, COUNTRY_NAME, COUNTRY_REGION, COUNTRY_SUBREGION

    コメント: 国・地域属性

    ────────────────────────────────────────

    カテゴリ:

    テーブル名: SH.SUPPLEMENTARY_DEMOGRAPHICS

    主なカラム (抜粋): CUST_ID, GOLF, SOCCER, TENNIS, AFFINITY_CARD

    コメント: 顧客の趣味・属性スコア

    ────────────────────────────────────────

    カテゴリ:

    テーブル名: SH.CAL_MONTH_SALES_MV / FWEEK_PSCAT_SALES_MV

    主なカラム (抜粋): 集計ビュー:月次・週次売上金額 (DOLLARS)

    コメント: 高速分析用マテリアライズドビュー

    ────────────────────────────────────────

    カテゴリ:

    テーブル名: その他(インデックス系テーブル等)

    主なカラム (抜粋): DR$SUP_TEXT_IDX* 系列

    コメント: テキスト検索インデックス(内部利用)

    

    

    

    主要分析パターン例

    

    分析目的: 売上トップ10商品

    推奨SQL (スキーマ修飾必須): sql SELECT p.PROD_NAME, SUM(s.AMOUNT_SOLD) AS 売上合計 FROM

      SH.SALES s JOIN SH.PRODUCTS p ON s.PROD_ID = p.PROD_ID GROUP BY p.PROD_NAME ORDER BY 売上合計

      DESC FETCH FIRST 10 ROWS ONLY;

    補足: FETCH FIRST … は Oracle 用の行数制限(ROWNUM <= 10 でも可)

    ────────────────────────────────────────

    分析目的: チャネル別売上構成比

    推奨SQL (スキーマ修飾必須): sql SELECT c.CHANNEL_DESC, SUM(s.AMOUNT_SOLD) AS 売上 FROM SH.SALES

      s JOIN SH.CHANNELS c ON s.CHANNEL_ID = c.CHANNEL_ID GROUP BY c.CHANNEL_DESC;

    補足: 構成比は結果を外部で計算、または SUM(s.AMOUNT_SOLD) / SUM(SUM(s.AMOUNT_SOLD)) OVER () 100

      を使用

    ────────────────────────────────────────

    分析目的: 前月比(売上)

    推奨SQL (スキーマ修飾必須): sql SELECT t.CALENDAR_MONTH_DESC, SUM(s.AMOUNT_SOLD) AS 売上,

      LAG(SUM(s.AMOUNT_SOLD)) OVER (ORDER BY t.CALENDAR_MONTH_DESC) AS 前月売上, CASE WHEN

      LAG(SUM(s.AMOUNT_SOLD)) OVER (ORDER BY t.CALENDAR_MONTH_DESC) = 0 THEN NULL ELSE

      (SUM(s.AMOUNT_SOLD) - LAG(SUM(s.AMOUNT_SOLD)) OVER (ORDER BY t.CALENDAR_MONTH_DESC)) /

      LAG(SUM(s.AMOUNT_SOLD)) OVER (ORDER BY t.CALENDAR_MONTH_DESC) 100 END AS 前月比 FROM SH.SALES

      s JOIN SH.TIMES t ON s.TIME_ID = t.TIME_ID GROUP BY t.CALENDAR_MONTH_DESC ORDER BY

      t.CALENDAR_MONTH_DESC;

    補足: 変化率は符号付きで表示

    ────────────────────────────────────────

    分析目的: 粗利(商品別)

    推奨SQL (スキーマ修飾必須): sql SELECT p.PROD_NAME, SUM(s.AMOUNT_SOLD) AS 売上合計,

      SUM(s.QUANTITY_SOLD c.UNIT_COST) AS コスト合計, (SUM(s.AMOUNT_SOLD) - SUM(s.QUANTITY_SOLD

      c.UNIT_COST)) AS 粗利 FROM SH.SALES s JOIN SH.PRODUCTS p ON s.PROD_ID = p.PROD_ID JOIN

      SH.COSTS c ON s.PROD_ID = c.PROD_ID AND s.TIME_ID = c.TIME_ID AND s.CHANNEL_ID = c.CHANNEL_ID

      AND s.PROMO_ID = c.PROMO_ID GROUP BY p.PROD_NAME ORDER BY 粗利 DESC FETCH FIRST 10 ROWS ONLY;

    補足: SH.COSTS の結合キーは 4 列に注意

    ────────────────────────────────────────

    分析目的: プロモーション効果比較

    推奨SQL (スキーマ修飾必須): sql SELECT CASE WHEN s.PROMO_ID = 999 THEN 'なし' ELSE 'あり' END

      AS プロモ区分, SUM(s.AMOUNT_SOLD) AS 売上合計 FROM SH.SALES s GROUP BY CASE WHEN s.PROMO_ID =

      999 THEN 'なし' ELSE 'あり' END;

    補足: PROMO_ID=999 を除外または明示区別

    

    

    

    ポイントコメント

    

    1. スキーマ修飾は必須 – 例: SH.SALES、SH.PRODUCTS のように必ずプレフィックスを付ける。  

    2. 日付フィルタは TIMES の文字列カラムか TIME_ID の DATE 型を使用。  

       - 月単位: WHERE t.CALENDAR_MONTH_DESC = '2001-06'  

       - 年単位: WHERE EXTRACT(YEAR FROM s.TIME_ID) = 2001  

    3. 行数制限は ROWNUM <= N または Oracle 12c+ の FETCH FIRST N ROWS ONLY。  

    4. プロモーションなしは 999 に固定 – 分析時に除外・区別を忘れずに。  

    5. 粗利計算は SH.COSTS と 4 列 (PROD_ID, TIME_ID, CHANNEL_ID, PROMO_ID) の完全一致で結合。キーが揃わないと正しいコストが取得できません。  

    

    

    

    次のステップ例

    - 上記サンプルSQLを実行し、興味ある指標(売上推移・チャネル別シェアなど)を具体的に取得。  

    - 必要なら期間やフィルタ条件(例: WHERE t.FISCAL_YEAR = 2003) を追加して、レポートに合わせたカスタマイズを行う。  

    

    ご要望があれば、特定の指標や期間に絞ったSQLを作成して実行結果をご提示します。

╰───────────────────────────────────────────────────────────────────────────────────────────────────╯


「このスキーマにアクセスして、販売分析を実行して。」

────────────────────────────────────────

このスキーマにアクセスして、販売分析を実行して。

────────────────────────────────────────


  ┊ ⚡ preparing mcp_ords_sampleserver_run_sql…

  ┊ ⚡ mcp_ords_   0.2s

  ┊ ⚡ preparing mcp_ords_sampleserver_run_sql…

  ┊ ⚡ mcp_ords_   0.1s

  ┊ ⚡ preparing mcp_ords_sampleserver_run_sql…

  ┊ ⚡ mcp_ords_   0.1s

  ┊ ⚡ preparing mcp_ords_sampleserver_run_sql…

  ┊ ⚡ mcp_ords_   0.1s


╭─ ⚕ Hermes ────────────────────────────────────────────────────────────────────────────────────────╮

    SH スキーマ販売分析結果

    

    | 項目         | 結果          |

    |--------------|---------------|

    | 全体売上金額 | 98,205,831.21 |

    | 全体販売数量 | 918,843       |

    

    上位 10 商品 (売上金額)

    

    | ランク | 商品名                                  | 売上金額      |

    |--------|-----------------------------------------|---------------|

    | 1      | Lithium Electric Golf Caddy             | 15,011,642.52 |

    | 2      | Soccer Goal - Official                  | 8,314,815.40  |

    | 3      | Pitching Machine and Batting Cage Combo | 7,189,171.77  |

    | 4      | Match Used Autograph Racquet            | 6,691,996.81  |

    | 5      | Soccer Goal - Portable                  | 6,312,268.40  |

    | 6      | Right-Handed Graphite Shaft Iron Set    | 5,635,963.08  |

    | 7      | Speed Trainer Bats and Training Program | 5,498,727.81  |

    | 8      | Limited Edition Racquet                 | 3,845,387.38  |

    | 9      | Team shirt                              | 3,721,699.61  |

    | 10     | English Willow Cricket Bat              | 3,543,725.89  |

    

    チャネル別売上構成

    

    | チャネル     | 売上金額      |

    |--------------|---------------|

    | Direct Sales | 57,875,260.60 |

    | Partners     | 26,346,342.32 |

    | Internet     | 13,706,802.03 |

    | Tele Sales   | 277,426.26    |

    

    > ポイント  

    > - Direct Sales が全体の約 59% を占め、最も重要な販売経路です。  

    > - Tele Sales は僅か 0.3% と極めて低いので、リソース再分配の検討余地があります。

    

    月次売上推移(2019‑01〜2020‑03)

    

    | カレンダーメンバー | 売上金額     |

    |--------------------|--------------|

    | 2019‑01            | 2,277,420.49 |

    | 2019‑02            | 2,372,690.87 |

    | 2019‑03            | 1,830,572.64 |

    | 2019‑04            | 1,975,978.30 |

    | 2019‑05            | 1,748,287.23 |

    | 2019‑06            | 1,869,728.61 |

    | 2019‑07            | 1,932,282.28 |

    | 2019‑08            | 1,972,532.63 |

    | 2019‑09            | 2,167,008.19 |

    | 2019‑10            | 2,236,464.53 |

    | 2019‑11            | 1,959,664.22 |

    | 2019‑12            | 1,741,284.96 |

    | 2020‑01            | 2,077,439.76 |

    | 2020‑02            | 2,357,629.26 |

    | 2020‑03            | 1,658,678.19 |

    

    > ポイント  

    > - 売上は季節変動が見られ、特に 2 月と 10 月がピークです。  

    > - 2020‑02 の増加はプロモーションや新商品投入が影響した可能性があります(要因分析可)。

    

    

    

    次にやると有益な分析例

    1. 前月比・前年比の変化率(ウィンドウ関数 LAG を使用)  

    2. 粗利分析(SH.COSTS と 4 列結合で商品別粗利を算出)  

    3. プロモーション効果比較(PROMO_ID = 999 を除外し、あり/なしで売上比較)  

    

    ご要望があれば、上記のいずれかを実装した SQL を作成し結果をご提示します。

╰───────────────────────────────────────────────────────────────────────────────────────────────────╯

 gpt-oss-120b │ 20.7K/131.1K │ [██░░░░░░░░] 16% │ 10m │ ⏲ 4m 46s 

─────────────────────────────────────────────────────────────────────────────────────────────────────

                                                                                                   

─────────────────────────────────────────────────────────────────────────────────────────────────────

 


今回の記事は以上になります。