「SQLを全く知らない営業担当がClaude CodeでDB→Excel自動取得を実現した」
SQLを一切知らない営業担当がClaude Codeに頼んだら、DBからExcelに売上データを自動取得するスクリプトを生成してくれた体験記。プロンプト実例6個とClaude Code生成コードを完全公開。
目次 クリックで開く
「SELECT文も書けない」という営業の私が、Claude Codeにチャットで頼んだら、MySQLのデータをExcelレポートに自動出力するスクリプトを生成してくれた。そのプロンプトと生成コードを全公開します。
Claude CodeがDB→Excel自動レポート生成スクリプトを生成した実行結果
1. きっかけ:毎朝の売上確認作業が30分かかっていた
私は営業部に所属しており、毎朝の業務として「昨日の売上データをDBから引き出してExcelにまとめて上司に報告する」という作業があります。DBの管理画面を開いて、管理部門の人にSQLを書いてもらって、CSVをエクスポートして、Excelに貼り付けて、グラフを作って…この作業が毎朝30分かかっていました。
SQLは全くわかりません。「SELECT」という単語は聞いたことがあるくらいです。でもClaude Codeに話しかけることを思いつき、試してみました。結果、SQLを一切書かずにMySQLのデータをExcelに自動取得するスクリプトが完成しました。
| 作業 | 手動(従来) | Claude Code自動化後 |
|---|---|---|
| 売上データ取得 | 管理部門に依頼・待ち時間あり | Pythonスクリプトが自動取得 |
| Excelレポート作成 | 手動で貼り付け・整形 20分 | 自動生成 30秒 |
| データ最新化 | 毎朝手動操作が必要 | 毎朝8時に自動実行 |
| 必要なスキル | SQL知識・DB接続知識 | Claude Codeに話しかけるだけ |
2. Claude Codeに「DB接続コード」を頼んでみた
まず私はClaude Codeのチャット画面を開いて、自分の状況をそのまま説明しました。Claude Codeは技術用語がわからなくても、日本語で丁寧に話しかければ理解してくれます。
プロンプト例 1
SQLは全くわかりません。Pythonでコードを書いてもらえますか?
データベース情報:
– ホスト名: db.company.com
– データベース名: sales_db
– テーブル名: orders(注文テーブル)
– 主な列: id, customer_name(顧客名), amount(金額), order_date(注文日)
Windowsを使っています。必要なライブラリのインストール方法も教えてください。

MySQLにはpymysqlとSQLAlchemy、データ操作にはpandasを使います。まず以下のコマンドでライブラリをインストールしてください。
pip install sqlalchemy pymysql pandas openpyxl python-dotenvDBのパスワードはコードに直接書かずに.envファイルで管理しましょう。以下のコードを生成しました。
Claude Codeはセキュリティ面まで考慮して、パスワードを.envファイルで管理する方法を自動的に提案してくれました。以下がClaude Codeが生成したDB接続コードです。
# まず .env ファイルを作成してください(同じフォルダに)
# .env の内容:
# DB_USER=あなたのユーザー名
# DB_PASS=あなたのパスワード
# DB_HOST=db.company.com
# DB_NAME=sales_db
from sqlalchemy import create_engine, text
import pandas as pd
import os
from dotenv import load_dotenv
# .envファイルから接続情報を読み込む(Claude Code推奨のセキュリティ方法)
load_dotenv()
# MySQL接続エンジン作成
engine = create_engine(
f"mysql+pymysql://"
f"{os.getenv('DB_USER')}:{os.getenv('DB_PASS')}"
f"@{os.getenv('DB_HOST')}/{os.getenv('DB_NAME')}",
pool_recycle=3600,
echo=False
)
# 接続テスト
try:
with engine.connect() as conn:
result = conn.execute(text("SELECT 1"))
print("DB接続成功!")
except Exception as e:
print(f"接続エラー: {e}")
Claude Codeが生成した接続コードを実行すると、問題なくMySQLに接続できました。「DB接続成功!」の表示を見たとき、感動しました。
3. 「日本語でSQLを書いて」とClaude Codeに頼んだ
DB接続ができたので、次はデータを取得するSQLをClaude Codeに作ってもらいました。Claude Codeには「こういうデータが欲しい」と日本語で説明するだけでSQLを生成してくれます。
プロンプト例 2
欲しいデータ:
– 直近30日間の売上データ
– 顧客別の売上合計と注文件数
– 売上金額の多い順に並べる
– 上位100件だけ取得する
日本語の要件からSQLを生成しました。GROUP BY、ORDER BY、LIMITを組み合わせた集計クエリです。
from sqlalchemy import create_engine, text
import pandas as pd
import os
from dotenv import load_dotenv
load_dotenv()
engine = create_engine(
f"mysql+pymysql://{os.getenv('DB_USER')}:{os.getenv('DB_PASS')}"
f"@{os.getenv('DB_HOST')}/{os.getenv('DB_NAME')}"
)
# Claude Codeが日本語の要件からSQLを生成
# 「直近30日・顧客別・売上合計・件数・上位100件」を実現
sql_top_customers = """
SELECT
customer_name AS 顧客名,
COUNT(id) AS 注文件数,
SUM(amount) AS 売上合計,
ROUND(AVG(amount), 0) AS 平均単価,
MAX(order_date) AS 最終注文日
FROM orders
WHERE order_date >= CURDATE() - INTERVAL 30 DAY
GROUP BY customer_name
ORDER BY 売上合計 DESC
LIMIT 100
"""
with engine.connect() as conn:
df = pd.read_sql(text(sql_top_customers), conn)
print(f"取得件数: {len(df)} 件")
print(df.head(10))
顧客名 注文件数 売上合計 平均単価 最終注文日
A商事株式会社 42 2,840,000 67,619 2026-04-24
B製造合同会社 38 2,350,000 61,842 2026-04-23
C物産株式会社 29 1,920,000 66,207 2026-04-24
…
SQLを一行も書かずに、顧客別の売上集計データが取得できました。Claude Codeは日本語の要件を正確にSQLに変換してくれました。
プロンプト例 3
カテゴリ別の売上比率も取得したいです。
ordersテーブルにはcategory(カテゴリ)列もあります。
それぞれSQLを書いてください。
Claude Codeは複数のSQLクエリを一度に生成してくれました。このように「追加でこれも欲しい」と話しかけるだけで、Claude Codeが対応するSQLを次々と生成してくれます。
4. Claude Codeにデータ→Excelレポート化を依頼した
取得したデータをExcelレポートにまとめる処理もClaude Codeに依頼しました。「複数のデータを1つのExcelファイルの別々のシートに書き込んでほしい」と説明しました。
プロンプト例 4
条件:
– シート1「顧客ランキング」:上位顧客データ
– シート2「月次推移」:月別売上データ
– シート3「カテゴリ別」:カテゴリ別集計
– ファイル名は「売上レポート_YYYYMMDD.xlsx」にする
– ヘッダー行は緑色にしてほしい(Excelの書式設定)
openpyxlのStyleを使ってヘッダーに色をつける方法を含めたコードを生成しました。ExcelWriterで複数シートに書き込みます。
from sqlalchemy import create_engine, text
import pandas as pd
from openpyxl.styles import PatternFill, Font, Alignment
from datetime import datetime
import os
from dotenv import load_dotenv
load_dotenv()
engine = create_engine(
f"mysql+pymysql://{os.getenv('DB_USER')}:{os.getenv('DB_PASS')}"
f"@{os.getenv('DB_HOST')}/{os.getenv('DB_NAME')}"
)
# ==============================
# Claude Codeが生成したSQLクエリ群
# ==============================
SQL_CUSTOMERS = """
SELECT customer_name AS 顧客名, COUNT(id) AS 注文件数,
SUM(amount) AS 売上合計, ROUND(AVG(amount), 0) AS 平均単価
FROM orders
WHERE order_date >= CURDATE() - INTERVAL 30 DAY
GROUP BY customer_name ORDER BY 売上合計 DESC LIMIT 100
"""
SQL_MONTHLY = """
SELECT DATE_FORMAT(order_date, '%Y年%m月') AS 月,
COUNT(id) AS 注文件数, SUM(amount) AS 売上合計
FROM orders
WHERE order_date >= CURDATE() - INTERVAL 365 DAY
GROUP BY DATE_FORMAT(order_date, '%Y年%m月')
ORDER BY MIN(order_date) DESC
"""
SQL_CATEGORY = """
SELECT category AS カテゴリ, COUNT(id) AS 件数,
SUM(amount) AS 売上合計,
ROUND(SUM(amount) * 100.0 / (SELECT SUM(amount) FROM orders WHERE order_date >= CURDATE() - INTERVAL 30 DAY), 1) AS 構成比
FROM orders
WHERE order_date >= CURDATE() - INTERVAL 30 DAY
GROUP BY category ORDER BY 売上合計 DESC
"""
# データ取得
with engine.connect() as conn:
df_customers = pd.read_sql(text(SQL_CUSTOMERS), conn)
df_monthly = pd.read_sql(text(SQL_MONTHLY), conn)
df_category = pd.read_sql(text(SQL_CATEGORY), conn)
print(f"顧客:{len(df_customers)}件 / 月次:{len(df_monthly)}件 / カテゴリ:{len(df_category)}件")
# ==============================
# Excelマルチシート出力(Claude Code生成)
# ==============================
today = datetime.now().strftime("%Y%m%d")
output_path = f"売上レポート_{today}.xlsx"
GREEN_FILL = PatternFill(start_color="107C41", end_color="107C41", fill_type="solid")
WHITE_FONT = Font(color="FFFFFF", bold=True)
def style_header(ws):
"""ヘッダー行を緑色・白文字にする(Claude Codeが自動追加)"""
for cell in ws[1]:
cell.fill = GREEN_FILL
cell.font = WHITE_FONT
cell.alignment = Alignment(horizontal="center")
# 列幅を自動調整
col_letter = cell.column_letter
ws.column_dimensions[col_letter].width = max(
len(str(cell.value or "")) + 4, 12
)
with pd.ExcelWriter(output_path, engine="openpyxl") as writer:
df_customers.to_excel(writer, sheet_name="顧客ランキング", index=False)
df_monthly.to_excel(writer, sheet_name="月次推移", index=False)
df_category.to_excel(writer, sheet_name="カテゴリ別", index=False)
# ヘッダーにスタイル適用
wb = writer.book
for sheet_name in ["顧客ランキング", "月次推移", "カテゴリ別"]:
style_header(wb[sheet_name])
print(f"Excelレポート生成完了: {output_path}")
Excelレポート生成完了: 売上レポート_20260425.xlsx
Claude Codeは「ヘッダーを緑色に」という要件を自動的にopenpyxlのスタイル設定コードに変換してくれました。さらに列幅の自動調整まで追加してくれました(私は頼んでいませんでした)。Claude Codeは実用的な機能を自発的に追加してくれます。
5. 逆方向:ExcelデータをDBに書き込むコードも頼んだ
DBからExcelへの取得だけでなく、ExcelのデータをDBに書き込む(逆方向)コードもClaude Codeに依頼しました。営業が入力したExcelの受注データをMySQLに自動登録する仕組みです。
プロンプト例 5
Excelのシート名は「受注データ」で、
列は「注文ID, 顧客名, 金額, 注文日, カテゴリ」です。
バリデーション(データ確認)も追加してください:
– 注文IDが重複している行は除外
– 金額が数値でない行は除外
– 欠損値がある行はスキップしてログに記録
import pandas as pd
from sqlalchemy import create_engine
import logging
import os
from dotenv import load_dotenv
load_dotenv()
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s",
handlers=[
logging.FileHandler("excel_to_db.log", encoding="utf-8"),
logging.StreamHandler()
]
)
engine = create_engine(
f"mysql+pymysql://{os.getenv('DB_USER')}:{os.getenv('DB_PASS')}"
f"@{os.getenv('DB_HOST')}/{os.getenv('DB_NAME')}"
)
def validate_and_load(excel_path: str, table_name: str = "orders"):
"""
ExcelをDBに書き込む(Claude Codeが生成したバリデーション付き)。
バリデーション:重複除去・型変換・欠損値スキップ
"""
# Excel読み込み
df = pd.read_excel(excel_path, sheet_name="受注データ", dtype=str)
logging.info(f"Excel読み込み完了: {len(df)} 行")
# 必須列チェック
required_cols = ["注文ID", "顧客名", "金額", "注文日", "カテゴリ"]
for col in required_cols:
if col not in df.columns:
raise ValueError(f"必須列が見つかりません: {col}")
# 型変換
df["注文日"] = pd.to_datetime(df["注文日"], errors="coerce")
df["金額"] = pd.to_numeric(df["金額"], errors="coerce")
# 欠損値のある行をスキップしてログ記録
null_mask = df[required_cols].isnull().any(axis=1)
if null_mask.any():
logging.warning(f"欠損値のある行をスキップ: {null_mask.sum()} 行")
df = df[~null_mask]
# 重複行削除(注文IDが重複している行を除外)
before = len(df)
df = df.drop_duplicates(subset="注文ID", keep="first")
logging.info(f"重複削除: {before - len(df)} 行")
# DB書き込み(appendモード: 既存データに追加)
df.to_sql(
name=table_name,
con=engine,
if_exists="append",
index=False,
chunksize=1000,
method="multi"
)
logging.info(f"DB書き込み完了: {len(df)} 行 → {table_name}")
# 実行(ファイルパスを変更してください)
validate_and_load(r"C:\受注データ\orders_2026.xlsx") # ← 変更
Claude Codeはコードと一緒に「if_exists='replace'にするとテーブルが全削除されます。本番環境では必ずappendを使ってください」という警告を自動で説明してくれました。初心者が陥りやすいミスをClaude Codeが先回りして防いでくれます。
6. Claude Codeに毎日自動実行の設定も依頼した
スクリプトが完成したので、毎朝8時に自動実行する設定もClaude Codeに任せました。
プロンプト例 6
生成したExcelファイルを上司のメールアドレス(boss@company.com)に
自動で送付するPythonスクリプトを書いてください。
スケジューリングはWindowsタスクスケジューラを使います。
メール送信とレポート生成を組み合わせたスクリプトと、タスクスケジューラへの登録コードを生成します。
import smtplib
from email.message import EmailMessage
from pathlib import Path
from datetime import datetime
def send_report_email(report_path: str):
"""生成したExcelレポートをメールで送付する(Claude Code生成)"""
today_str = datetime.now().strftime("%Y年%m月%d日")
msg = EmailMessage()
msg["Subject"] = f"【{today_str}】日次売上レポート"
msg["From"] = os.getenv("SMTP_USER")
msg["To"] = "boss@company.com"
msg.set_content(f"""\
お疲れさまです。
{today_str}分の日次売上レポートをお送りします。
※このメールはClaude Code生成スクリプトにより自動送信されています。
""")
with open(report_path, "rb") as f:
msg.add_attachment(
f.read(), maintype="application",
subtype="vnd.openxmlformats-officedocument.spreadsheetml.sheet",
filename=Path(report_path).name
)
with smtplib.SMTP("smtp.gmail.com", 587) as smtp:
smtp.starttls()
smtp.login(os.getenv("SMTP_USER"), os.getenv("SMTP_PASS"))
smtp.send_message(msg)
print(f"レポートを送付しました: boss@company.com")
if __name__ == "__main__":
# レポート生成 → メール送付の一連の処理
report_path = generate_daily_report() # 上記のdb_to_excel_report.pyの関数
send_report_email(report_path)
毎朝8時に自動実行されるようになってから、私は毎朝パソコンを開くと上司にレポートが既に届いている状態になりました。Claude Codeとのやり取りが6回のプロンプトで、SQL知識ゼロから完全自動化が実現しました。
7. 導入事例
物流会社(社員200名):配送実績ExcelをSQL Serverに自動同期、在庫管理をリアルタイム化
全国10拠点の担当者が入力する配送実績Excelを、毎日手動でSQL Serverにインポートしていた物流会社の事例。Claude Codeに「Excelの配送実績データをSQL Serverに毎日自動同期したい」と伝えるだけで、差分更新コードが生成されました。
ECサイト運営会社(社員120名):受注ExcelをMySQLに毎時同期、手動転記ミスをゼロに
受注管理Excelを1日3回手動でMySQLにコピー&ペースト転記していたEC会社。Claude Codeに「受注ExcelをMySQLに自動書き込みするバリデーション付きのコードを書いて」と依頼。1回のやり取りで転記自動化が完成しました。
関連記事
8. よくある質問
関連記事