BigQuery クエリへの請求のエクスポート例

エクスポートされた課金データに対して BigQuery クエリを使用する方法の例をいくつか紹介します。

請求書の料金総額を取得する

次のクエリで、エクスポートされた課金データを使用して料金とクレジット額を表示する 2 つの方法を説明します。

  • total フィールドは、浮動小数点数の料金とクレジット額をそのまま合計します。そのため、浮動小数点の丸め誤差が生じる可能性があります。
  • total_exact フィールドは、料金とクレジット額をマイクロに変換してから合計します。その合計金額をドルに戻すことで、浮動小数点の丸め誤差を回避します。

例 1: 請求月ごとのすべての料金の合計

次のクエリでは、各月の請求総額が、通常料金、税金、調整額、および丸め誤差の合計として表示されます。

標準 SQL

SELECT
  invoice.month,
  SUM(cost)
    + SUM(IFNULL((SELECT SUM(c.amount)
                  FROM UNNEST(credits) c), 0))
    AS total,
  (SUM(CAST(cost * 1000000 AS int64))
    + SUM(IFNULL((SELECT SUM(CAST(c.amount * 1000000 as int64))
                  FROM UNNEST(credits) c), 0))) / 1000000
    AS total_exact
FROM `project.dataset.gcp_billing_export_v1_XXXXXX_XXXXXX_XXXXXX`
GROUP BY 1
ORDER BY 1 ASC
;

たとえば、上記のクエリは次のような結果になります。

Row month total total_exact
1 201901 $1005.004832999999984 $1005.00
2 201902 $992.3101739999999717 $992.31
3 201903 $1220.761089999999642 $1220.76

例 2: 請求月ごとの料金タイプ別詳細を取得する

次のクエリでは、各月の cost_type ごとの合計が表示されます。料金タイプには、通常料金、税金、調整額、および丸め誤差があります。

標準 SQL

SELECT
  invoice.month,
  cost_type,
  SUM(cost)
    + SUM(IFNULL((SELECT SUM(c.amount)
                  FROM   UNNEST(credits) c), 0))
    AS total,
  (SUM(CAST(cost * 1000000 AS int64))
    + SUM(IFNULL((SELECT SUM(CAST(c.amount * 1000000 as int64))
                  FROM UNNEST(credits) c), 0))) / 1000000
    AS total_exact
FROM `project.dataset.gcp_billing_export_v1_XXXXXX_XXXXXX_XXXXXX`
GROUP BY 1, 2
ORDER BY 1 ASC, 2 ASC
;

たとえば、上記のクエリは次のような結果になります。

Row month cost_type total total_exact
1 201901 regular $1000.501209987994782 $1000.50
2 201901 rounding_error –$0.500489920049387 –$0.50
3 201901 tax $10.000329958477891 $10.00
4 201901 adjustment –$5.002572999387045 –$5.00

その他のクエリ例

以下の例で、データのクエリを実行するその他の方法を説明します。

このセクションの例では、次のことを前提とします。

  • アプリを 2 つ(grapefruit-squeezer と chocolate-masher)持っている。
  • アプリごとに、2 つの環境(開発と本番)がある。
  • アプリごとに、開発環境に 1 つの小さいインスタンスがある。
  • 本番環境では、アメリカに 1 つの小さいインスタンス、アジアに 1 つの小さいインスタンスがある。
  • 各インスタンスには、アプリと環境のラベルが付けられている。
  • 実験に使用するラベルのないインスタンスが 1 つある。

請求額合計は $24 で、内訳は次のとおりです。

インスタンス ラベル 合計費用
1 つの VCPU がアメリカで稼働している小規模インスタンス なし $4
1 つの VCPU がアメリカで稼働している小規模インスタンス アプリ: chocolate-masher
環境: 開発
$2
1 つの VCPU がアメリカで稼働している小規模インスタンス アプリ: grapefruit-squeezer
環境: 開発
$3
1 つの VCPU がアメリカで稼働している小規模インスタンス アプリ: chocolate-masher
環境: 本番
$3.25
1 つの VCPU がアジアで稼働している小規模インスタンス アプリ: chocolate-masher
環境: 本番
$3.75
1 つの VCPU がアメリカで稼働している小規模インスタンス アプリ: grapefruit-squeezer
環境: 本番
$3.50
1 つの VCPU がアジアで稼働している小規模インスタンス アプリ: grapefruit-squeezer
環境: 本番
$4.50

グループ化せずにすべての行に対してクエリを発行

上記の費用を最も詳細に確認する方法は、グループ化せずにすべての行に対してクエリを実行することです。ラベルと SKU の説明を除き、すべてのフィールド(プロジェクト、サービスなど)が同じであるとします。

標準 SQL

SELECT
  sku.description,
  TO_JSON_STRING(labels) as labels,
 cost as cost
FROM `project.dataset.table`;

レガシー SQL

TO_JSON_STRING Not supported.
Row sku.description labels cost
1 1 つの VCPU がアメリカで稼働している小規模インスタンス [] $4
2 1 つの VCPU がアメリカで稼働している小規模インスタンス [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"dev"}] $2
3 1 つの VCPU がアメリカで稼働している小規模インスタンス [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"dev"}] $3
4 1 つの VCPU がアメリカで稼働している小規模インスタンス [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"prod"}] $3.25
5 1 つの VCPU がアジアで稼働している小規模インスタンス [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"prod"}] $3.75
6 1 つの VCPU がアメリカで稼働している小規模インスタンス [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"prod"}] $3.50
7 1 つの VCPU がアジアで稼働している小規模インスタンス [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"prod"}] $4.50
合計 $24

ラベルマップ別に JSON 文字列としてグループ化

これは、ラベルの組み合わせごとに費用を素早く簡単に割り出す方法です。

標準 SQL

SELECT
  TO_JSON_STRING(labels) as labels,
  sum(cost) as cost
FROM `project.dataset.table`
GROUP BY labels;

レガシー SQL

TO_JSON_STRING Not supported.
Row labels cost
1 [] $4
2 [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"dev"}] $2
3 [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"dev"}] $3
4 [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"prod"}] $7
5 [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"prod"}] $8
合計 $24

ラベル値を基準に特定のキーについてグループ化

特定のラベルキーの値についての費用を割り出すのは、一般的な使用例です。LEFT JOIN を使用し、JOIN 条件(WHERE ではなく)としてキーフィルタを設定すると、このキーを含まない費用が含まれるため、費用の全体像を把握できます。

標準 SQL

SELECT
  labels.value as environment,
  SUM(cost) as cost
FROM `project.dataset.table`
LEFT JOIN UNNEST(labels) as labels
  ON labels.key = "environment"
GROUP BY environment;

レガシー SQL

SELECT
  labels.value as environment,
  SUM(cost) as cost
FROM [project:dataset.table]
WHERE labels.key = "environment" OR labels.key IS NULL
GROUP BY environment;
Row environment cost
1 prod $15
2 dev $5
3 null $4
合計 $24

キー / 値のペア別にグループ化

これらの結果を解釈またはエクスポートするときは注意してください。ここでは各行が、二重カウントなしの有効な合計を示していますが、他の行と組み合わせることはできません(ただし、キーが同じである場合や、同じリソースに複数のキーが設定されていない場合などは除きます)。

標準 SQL

SELECT
  labels.key as key,
  labels.value as value,
  SUM(cost) as cost
FROM `project.dataset.table`
LEFT JOIN UNNEST(labels) as labels
GROUP BY key, value;

レガシー SQL

SELECT
  labels.key as key,
  labels.value as value,
  SUM(cost)
FROM [project:dataset.table]
GROUP BY key, value;
Row key value cost
1 null null $4
2 app chocolate-masher $9
3 app grapefruit-squeezer $11
4 environment dev $5
5 environment prod $15
合計 $44

合計が請求額より大きいことに注意してください。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Billing のドキュメント
ご不明な点がありましたら、Google のサポートページをご覧ください。