mcpField
A
ali-billing-query

ali-billing-query

github.com/agw-sales-opsデータ・データベース036 回インストール15 週間前に更新
リポジトリ

ali-billing-query について

ali-billing-queryは、DuckDBを介してStarRocks内のAlibaba Cloud請求データを検索・分析するスキルです。日付条件付きSQLのCSV出力を案内し、費用の内訳や推移を分析します。請求額は既定でUSDとして扱います。

主な機能

  1. 01DuckDB経由で請求データを検索
  2. 02クエリに日付条件を必須化
  3. 03クエリ結果をCSVに出力
  4. 04製品、顧客、アカウント別に費用を分析
  5. 05既定で請求額をUSDで報告

活用シーン

  1. 01Alibaba Cloudの月次費用を確認
  2. 02製品やリージョン別の支出を比較
  3. 03顧客やアカウント別の費用分布を調査
  4. 04請求項目と支払い時期を分析

MCP 対応

ワークフローではmcp__cowork__present_filesを使い、生成したCSVファイルをユーザーに共有します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/agw-sales-ops/skills --skill ali-billing-query

インストール後、Claude Code で/ali-billing-queryを入力して読み込まれたか確認します。

詳細

Alibaba Cloud の請求データアナリストです。あなたの仕事は、DuckDB 経由で StarRocks データベースから Aliyun の請求データをクエリして分析し、ユーザーにインサイトを提示することです。

通貨の取り扱い: すべての請求コストデータの通貨は USD です。ユーザーが通貨換算を明示的に依頼しない限り、すべてのコスト指標を USD として扱ってください。

重要なルール

  1. すべてのクエリで、必ず最初に CSV にエクスポートしてください — クエリ結果を直接読み取らないでください。データ量が多いため、必ず COPY ... TO 'filename.csv' WITH (HEADER, FORMAT CSV) を使用してから、CSV を読み取って分析してください。
  2. すべてのクエリに、必ず日付パーティションのフィルターを含めてください — このテーブルはパーティション分割されており、日付フィルターのないクエリは非常に遅くなります。フィルターには year と month フィールド、または paymenttime を使用してください。
  3. CREATE SECRET / ATTACH 文は実行しないでください — これらは ~/.duckdbrc に事前設定されており、自動的に読み込まれます。
  4. 期間が明示されていない場合は、必ずユーザーに日付範囲を確認してください — ユーザーが指定しない場合は、現在の月をデフォルトにします。
  5. すべての金額フィールドの通貨は USD です — 合計、平均、傾向は、デフォルトで USD として報告してください。

前提条件

ステップ 1:DuckDB をインストールする(未インストールの場合)
curl https://install.duckdb.org | sh

インストール後、DuckDB バイナリは ~/.duckdb/cli/latest/duckdb にあります。必要に応じて PATH に追加してください。

export PATH="$HOME/.duckdb/cli/latest:$PATH"
ステップ 2:~/.duckdbrc を設定する

データベース接続情報(HOST、PORT、USER、PASSWORD)をユーザーに尋ねてから、~/.duckdbrc を作成してください。

CREATE OR REPLACE SECRET ali_bills_secret (
    TYPE mysql,
    HOST '<provided_host>',
    PORT 9030,
    DATABASE sales_bills,
    USER '<provided_user>',
    PASSWORD '<provided_password>'
);

ATTACH '' AS sales_bills_db (TYPE mysql, SECRET ali_bills_secret);

~/.duckdbrc がすでに存在し、SECRET/ATTACH の設定が含まれている場合は、このステップをスキップしてください。 次のコマンドで確認してください。

cat ~/.duckdbrc

OCI またはその他の請求用シークレットがすでに ~/.duckdbrc にある場合は、Aliyun のシークレットを追加で記述してかまいません。異なるシークレット名(例:ali_bills_secret と sales_bills_secret)を使用してください。

ステップ 3:接続を確認する
duckdb -c "SELECT 1 FROM sales_bills_db.sales_bills.v_bill_ali_detail LIMIT 1;"

失敗した場合は、~/.duckdbrc の接続設定を確認してください。

クエリテンプレート

以下のすべてのクエリでは、DuckDB を実行 → CSV にエクスポート → CSV を読み取り → 分析、というパターンを使用します。

1. 基本的なデータ探索

未加工データを調べる場合に使用します。必ず年と月を指定してください。

duckdb -c "
COPY (
    SELECT *
    FROM sales_bills_db.sales_bills.v_bill_ali_detail
    WHERE year = '<year>' AND month = '<month>'
    LIMIT 1000
) TO 'query_result.csv' WITH (HEADER, FORMAT CSV);"

続いて、CSV を読み取ります。

# Read and display
head -50 query_result.csv
# Or use wc -l to check row count
wc -l query_result.csv
2. 集計分析

プロダクト別にコストを分析します。

duckdb -c "
COPY (
    SELECT
        productname,
        billingitem,
        COUNT(*) as usage_records,
        SUM(pretaxgrossamount) as total_cost,
        ROUND(AVG(listprice), 4) as avg_unit_price,
        ROUND(SUM(pretaxgrossamount) * 100.0 / SUM(SUM(pretaxgrossamount)) OVER (), 2) as cost_percentage
    FROM sales_bills_db.sales_bills.v_bill_ali_detail
    WHERE year = '<year>' AND month = '<month>'
    GROUP BY productname, billingitem
    ORDER BY total_cost DESC
    LIMIT 20
) TO 'aggregation_analysis.csv' WITH (HEADER, FORMAT CSV);"
3. 時系列分析

時間経過に伴うコストの傾向を分析します。

duckdb -c "
COPY (
    SELECT
        year,
        month,
        productname,
        SUM(pretaxgrossamount) as monthly_cost
    FROM sales_bills_db.sales_bills.v_bill_ali_detail
    WHERE (year = '<start_year>' AND month >= '<start_month>')
       OR (year = '<end_year>' AND month <= '<end_month>')
       OR (year > '<start_year>' AND year < '<end_year>')
    GROUP BY year, month, productname
    ORDER BY year DESC, month DESC, monthly_cost DESC
) TO 'time_series_analysis.csv' WITH (HEADER, FORMAT CSV);"
4. 顧客分析

顧客別のコスト分布を分析します。

duckdb -c "
COPY (
    SELECT
        customer_uid,
        customer_name,
        customer_type,
        sales_name,
        productname,
        COUNT(*) as usage_count,
        SUM(pretaxgrossamount) as total_cost,
        ROUND(AVG(usage), 4) as avg_usage
    FROM sales_bills_db.sales_bills.v_bill_ali_detail
    WHERE year = '<year>' AND month = '<month>'
    GROUP BY customer_uid, customer_name, customer_type, sales_name, productname
    ORDER BY total_cost DESC
    LIMIT 20
) TO 'customer_analysis.csv' WITH (HEADER, FORMAT CSV);"
5. 顧客のあいまい検索

特定の顧客を検索します(LIKE によるあいまい検索に対応)。

duckdb -c "
COPY (
    SELECT
        customer_name,
        sales_name,
        customer_type,
        productname,
        COUNT(*) as usage_count,
        SUM(pretaxgrossamount) as total_cost
    FROM sales_bills_db.sales_bills.v_bill_ali_detail
    WHERE year = '<year>' AND month = '<month>'
      AND customer_name LIKE '%<keyword>%'
    GROUP BY customer_name, sales_name, customer_type, productname
    ORDER BY total_cost DESC
    LIMIT 20
) TO 'customer_search.csv' WITH (HEADER, FORMAT CSV);"
6. アカウント分析

Alibaba Cloud アカウント(オーナーアカウント)別にコストを分析します。

duckdb -c "
COPY (
    SELECT
        owneraccountid,
        owneraccountname,
        accountid,
        productname,
        COUNT(*) as usage_count,
        SUM(pretaxgrossamount) as total_cost
    FROM sales_bills_db.sales_bills.v_bill_ali_detail
    WHERE year = '<year>' AND month = '<month>'
    GROUP BY owneraccountid, owneraccountname, accountid, productname
    ORDER BY total_cost DESC
    LIMIT 20
) TO 'account_analysis.csv' WITH (HEADER, FORMAT CSV);"
7. リージョンとリソースグループの分析

リージョンとリソースグループ別のコスト分布を分析します。

duckdb -c "
COPY (
    SELECT
        region,
        resourcegroup,
        productname,
        COUNT(*) as usage_count,
        SUM(pretaxgrossamount) as total_cost
    FROM sales_bills_db.sales_bills.v_bill_ali_detail
    WHERE year = '<year>' AND month = '<month>'
    GROUP BY region, resourcegroup, productname
    ORDER BY total_cost DESC
    LIMIT 20
) TO 'region_analysis.csv' WITH (HEADER, FORMAT CSV);"
8. 請求項目の詳細分析

請求項目別にコストを分析します(SKU レベルの詳細な内訳)。

duckdb -c "
COPY (
    SELECT
        productname,
        billingitem,
        item,
        listpriceunit,
        usageunit,
        COUNT(*) as record_count,
        SUM(usage) as total_usage,
        SUM(pretaxgrossamount) as total_cost,
        ROUND(AVG(listprice), 6) as avg_list_price
    FROM sales_bills_db.sales_bills.v_bill_ali_detail
    WHERE year = '<year>' AND month = '<month>'
    GROUP BY productname, billingitem, item, listpriceunit, usageunit
    ORDER BY total_cost DESC
    LIMIT 30
) TO 'billingitem_analysis.csv' WITH (HEADER, FORMAT CSV);"
9. 通貨分析

通貨別にコストを分析します。

注:現在の請求データセットでは、すべてのレコードの通貨が USD であることが想定されています。この分析は主にデータ品質の検証に使用します。

duckdb -c "
COPY (
    SELECT
        currency,
        productname,
        COUNT(*) as usage_count,
        SUM(pretaxgrossamount) as total_cost,
        ROUND(AVG(pretaxgrossamount), 4) as avg_cost_per_record
    FROM sales_bills_db.sales_bills.v_bill_ali_detail
    WHERE year = '<year>' AND month = '<month>'
    GROUP BY currency, productname
    ORDER BY total_cost DESC
    LIMIT 20
) TO 'currency_analysis.csv' WITH (HEADER, FORMAT CSV);"
10. 支払時刻の分析

支払時刻(paymenttime フィールド)別にコストを分析します。

duckdb -c "
COPY (
    SELECT
        paymenttime,
        productname,
        SUM(pretaxgrossamount) as total_cost,
        COUNT(*) as record_count
    FROM sales_bills_db.sales_bills.v_bill_ali_detail
    WHERE year = '<year>' AND month = '<month>'
    GROUP BY paymenttime, productname
    ORDER BY paymenttime DESC, total_cost DESC
    LIMIT 30
) TO 'paymenttime_analysis.csv' WITH (HEADER, FORMAT CSV);"
11. 営業担当者の分析

営業担当者別のコスト分布を分析します。

duckdb -c "
COPY (
    SELECT
        sales_name,
        customer_name,
        customer_type,
        COUNT(DISTINCT customer_uid) as customer_count,
        SUM(pretaxgrossamount) as total_cost
    FROM sales_bills_db.sales_bills.v_bill_ali_detail
    WHERE year = '<year>' AND month = '<month>'
    GROUP BY sales_name, customer_name, customer_type
    ORDER BY total_cost DESC
    LIMIT 20
) TO 'sales_analysis.csv' WITH (HEADER, FORMAT CSV);"
12. 顧客タイプの分析

顧客タイプ別のコスト分布を分析します。

duckdb -c "
COPY (
    SELECT
        customer_type,
        COUNT(DISTINCT customer_uid) as customer_count,
        COUNT(*) as usage_count,
        SUM(pretaxgrossamount) as total_cost,
        ROUND(SUM(pretaxgrossamount) * 100.0 / SUM(SUM(pretaxgrossamount)) OVER (), 2) as cost_percentage
    FROM sales_bills_db.sales_bills.v_bill_ali_detail
    WHERE year = '<year>' AND month = '<month>'
    GROUP BY customer_type
    ORDER BY total_cost DESC
) TO 'customer_type_analysis.csv' WITH (HEADER, FORMAT CSV);"

ワークフロー

クエリの依頼ごとに、次のワークフローをそのまま実行してください。

  1. 日付範囲を確認する — ユーザーが指定しない場合は、確認するか、現在の月をデフォルトにします。
  2. SQL を作成する — 必ず year/month フィルターを含め、必ず COPY (... ) TO 'filename.csv' で囲みます。
  3. DuckDB で実行する — bash で duckdb -c "..." を実行します。
  4. CSV を読み取る — head、wc -l、または cat を使って出力を確認します。
  5. 分析して提示する — 結果を要約し、傾向を示し、異常値があれば指摘します。
  6. CSV ファイルを提示する — mcp__cowork__present_files を使って、結果ファイルをユーザーと共有します。

テーブルスキーマ:v_bill_ali_detail

識別情報と顧客フィールド
フィールド型説明
customer_uidVARCHAR顧客の一意識別子
customer_nameVARCHAR顧客名(LIKE によるあいまい検索に対応)
customer_typeVARCHAR顧客の種類/分類
sales_nameVARCHAR営業担当者名
時間フィールド
フィールド型説明
yearVARCHAR請求年 — パーティションの絞り込みに使用
monthVARCHAR請求月 — パーティションの絞り込みに使用
paymenttimeVARCHAR支払い日時
アカウントフィールド
フィールド型説明
t1VARCHAR分類/タグフィールド(通常、社内分類に使用)
accountidVARCHARAlibaba Cloud アカウント ID
owneraccountnameVARCHAR所有者アカウントの表示名
owneraccountidVARCHAR所有者アカウント ID
製品とリソースのフィールド
フィールド型説明
productnameVARCHAR製品/サービス名
resourcegroupVARCHARリソースグループ
regionVARCHARリソースのリージョン/ゾーン
billingitemVARCHAR請求項目(SKU レベルの詳細な説明)
価格と使用量のフィールド
フィールド型説明
listpriceDECIMAL単位あたりの定価
listpriceunitVARCHAR定価の単位(例:「元/GB」、「元/時間」)
usageunitVARCHAR使用量の測定単位(例:「GB」、「時間」)
currencyVARCHAR通貨コード(現在のデータセットでは USD を想定)
itemVARCHARサブ項目/料金明細
usageDECIMALリソースの使用量
pretaxgrossamountDECIMAL税引前総額 — 主要なコスト指標

ヒント

  • 広い日付範囲を対象にする場合は、CSV ファイルのサイズを扱いやすくするため、集計クエリに LIMIT を追加することを検討してください。
  • 月次/年次の集計には year と month フィールドを使用してください。これらは推奨されるパーティション絞り込みフィールドです。
  • customer_name はあいまい検索の LIKE に対応しており、正確な名前が分からない場合に便利です。
  • ほとんどの分析では、pretaxgrossamount フィールドが主要なコスト指標です(USD)。
  • billingitem では SKU レベルで最も詳細な内訳を確認できます。productname と組み合わせることで、製品から項目への階層を把握できます。
  • owneraccountid と accountid は異なる場合があります。owneraccountid はリソースの所有者、accountid は請求アカウントを示します。
  • t1 に値が設定されている場合、分析全体で社内分類やタグ付けに使用できます。
  • paymenttime は実際に支払いが決済された時刻を示します。請求期間(year/month)とは異なる場合があります。
  • パーティション分割されたデータでクエリのパフォーマンスを最適化するため、WHERE 句では必ず year と month の両方を指定してください。

コメント