Cloud Billing 数据导出查询示例

本页面提供了一些示例,演示如何查询导出并存储在 BigQuery 中的 Cloud Billing 数据。

如需详细了解如何将结算数据导出到 BigQuery,请参阅概览限制

根据结算报告生成 SQL 查询

如需快速编写 SQL 查询以在 BigQuery 中返回与结算报告中的结果等效的结果,您可以使用 Google Cloud 控制台提供的结算报告中的生成查询功能。

指定要在查询中使用的表名称

在这些示例中,如需在 BigQuery 中查询导出的 Cloud Billing 数据,您需要在 FROM 子句中指定表名称的完整路径。表名称使用以英文句点分隔的三个值来确定:

project-ID.dataset_name.BQ_table_name

  • project-ID 是您设置的包含 BigQuery 数据集的 Google Cloud 项目 ID。
  • dataset_name您设置的 BigQuery 数据集的名称,该数据集用于包含具有已导出 Cloud Billing 数据的 BigQuery 表。
  • BQ_table_name 是您要查询的已导出 Cloud Billing 数据所在的 BigQuery 表的名称。

    系统会根据您启用的导出类型,为包含已导出 Cloud Billing 数据的 BigQuery 表自动分配名称:

    • 标准使用费表:在 BigQuery 数据集中,该表命名为 gcp_billing_export_v1_<BILLING-ACCOUNT-ID>

    • 详细使用费表:在 BigQuery 数据集中,该表命名为 gcp_billing_export_resource_v1_<BILLING-ACCOUNT-ID>

    • 价格表:在 BigQuery 数据集中,该表命名为 cloud_pricing_export

例如,假设您有一个配置为导出详细使用费数据的 Cloud Billing 账号,并且账单导出配置的组成部分如下所示:

  • project-IDmy-billing-project
  • dataset_namemy_billing_dataset
  • BQ_table_namegcp_billing_export_resource_v1_<BILLING-ACCOUNT-ID>
  • BILLING-ACCOUNT-ID010101-F0FFF0-10X10X - 这是包含您要导出的结算数据的 Cloud Billing 账号的 ID。了解如何查找您的结算账号 ID

根据示例值,您需按如下所示编写 FROM 子句:

my-billing-project.my_billing_dataset.gcp_billing_export_resource_v1_010101-F0FFF0-10X10X

按 Cloud Billing 数据类型进行的查询示例

本页面提供标准使用费数据详细使用费数据价格数据的查询示例。

如果您选择导出详细使用费数据,那么除了“详细使用费”查询示例之外,您也可以使用“标准使用费”查询示例。

标准使用费数据 详细使用费数据 价格数据
标准使用费查询示例 详细使用费查询示例 价格数据查询示例

标准使用费查询示例

本部分提供了查询导出到 BigQuery 的 Cloud Billing 标准使用费数据的示例。

这些查询示例也适用于导出到 BigQuery 的详细使用费数据,但它们并非用于检索随详细使用费导出选项提供的任何资源级信息。

标准费用查询示例中使用的常用值

本部分中的查询示例使用以下值作为表名称project-ID.dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX

返回账单总费用

以下查询演示了使用导出的结算数据查看费用和赠金值的两种方法。

  • total 字段直接对浮点费用和赠金值求和,可能会产生浮点舍入误差。
  • total_exact 字段在求和之前将费用和赠金值转换为 micros,然后在求和后转换回美元,以避免产生浮点舍入误差。

示例 1:每个账单的所有费用总和

此查询显示了每个月的账单总额,即常规费用、税费、调整项和舍入误差的总和。

标准 SQL

SELECT
  invoice.month,
  SUM(cost)
    + SUM(IFNULL((SELECT SUM(c.amount)
                  FROM UNNEST(credits) c), 0))
    AS total,
  (SUM(CAST(cost AS NUMERIC))
    + SUM(IFNULL((SELECT SUM(CAST(c.amount AS NUMERIC))
                  FROM UNNEST(credits) AS c), 0)))
    AS total_exact
FROM `project-ID.dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX`
GROUP BY 1
ORDER BY 1 ASC
;

例如,上述查询的结果可能是:

总计 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 AS NUMERIC))
    + SUM(IFNULL((SELECT SUM(CAST(c.amount AS NUMERIC))
                  FROM UNNEST(credits) AS c), 0)))
    AS total_exact
FROM `project-ID.dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX`
GROUP BY 1, 2
ORDER BY 1 ASC, 2 ASC
;

例如,上述查询的结果可能是:

费用类型 总计 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 个环境(dev 和 prod)。
  • 每个应用的 dev 环境中有 1 个小型实例。
  • Prod 环境在美洲和亚洲各有 1 个小型实例。
  • 每个实例都带有应用和环境标签。
  • 您有 1 个实例不带任何用于实验的标签。

您的总账单费用为 $24,明细如下:

实例 标签 总费用
1 个在美洲运行的小型实例(有 1 个 vCPU) $4
1 个在美洲运行的小型实例(有 1 个 vCPU) 应用:chocolate-masher
环境:dev
$2
1 个在美洲运行的小型实例(有 1 个 vCPU) 应用:grapefruit-squeezer
环境:dev
$3
1 个在美洲运行的小型实例(有 1 个 vCPU) 应用:chocolate-masher
环境:prod
$3.25
1 个在亚洲运行的小型实例(有 1 个 vCPU) 应用:chocolate-masher
环境:prod
$3.75
1 个在美洲运行的小型实例(有 1 个 vCPU) 应用:grapefruit-squeezer
环境:prod
$3.50
1 个在亚洲运行的小型实例(有 1 个 vCPU) 应用:grapefruit-squeezer
环境:prod
$4.50

查询每一行而不分组

这些费用的细化程度最高的视图是查询每一行而不分组。我们假设除标签和 SKU 说明外的所有其他字段都相同(项目、服务等)。

标准 SQL

SELECT
  sku.description,
  TO_JSON_STRING(labels) as labels,
 cost as cost
FROM `project-ID.dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX`;

旧版 SQL

TO_JSON_STRING not supported.
sku.description 标签 费用
1 1 个在美洲运行的小型实例(有 1 个 vCPU) [] $4
2 1 个在美洲运行的小型实例(有 1 个 vCPU) [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"dev"}] $2
3 1 个在美洲运行的小型实例(有 1 个 vCPU) [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"dev"}] $3
4 1 个在美洲运行的小型实例(有 1 个 vCPU) [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"prod"}] $3.25
5 1 个在亚洲运行的小型实例(有 1 个 vCPU) [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"prod"}] $3.75
6 1 个在美洲运行的小型实例(有 1 个 vCPU) [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"prod"}] $3.50
7 1 个在亚洲运行的小型实例(有 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-ID.dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX`
GROUP BY labels;

旧版 SQL

TO_JSON_STRING not supported.
标签 费用
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-ID.dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX`
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-ID:dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX]
WHERE labels.key = "environment" OR labels.key IS NULL
GROUP BY environment;
环境 费用
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-ID.dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX`
LEFT JOIN UNNEST(labels) as labels
GROUP BY key, value;

旧版 SQL

SELECT
  labels.key as key,
  labels.value as value,
  SUM(cost)
FROM [project-ID:dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX]
GROUP BY key, value;
费用
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 账号和项目,请参阅承诺使用折扣的归因

查看承诺费用

要在结算数据导出中查看承诺使用折扣的承诺费用,请使用以下查询示例。

标准 SQL

SELECT
    invoice.month AS invoice_month,
    SUM(cost) as commitment_fees
FROM `project-ID.dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX`
WHERE LOWER(sku.description) LIKE "commitment%"
GROUP BY 1

查看承诺赠金

如需查看结算数据导出中的承诺使用折扣赠金,请使用以下查询示例。

标准 SQL

SELECT
    invoice.month AS invoice_month,
    SUM(credits.amount) as CUD_credits
FROM `project-ID.dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX`
LEFT JOIN UNNEST(credits) AS credits
WHERE credits.type = "COMMITTED_USAGE_DISCOUNT"
GROUP BY 1

使用资源层次结构过滤条件查看祖先实体

您可以使用资源层次结构过滤条件以按项目、文件夹和组织等层次结构元素来汇总费用。这些查询示例显示了对按资源层次结构元素过滤的费用汇总并显示项目祖先的方法。

示例 1:按资源名称过滤

此示例演示的查询按项目祖先实体对费用进行分组,并仅过滤由指定层次结构元素(由相对资源名称标识)生成的费用。

字符串方法

SELECT
    invoice.month AS invoice_month,
    TO_JSON_STRING(project.ancestors) as ancestors,
    SUM(cost)
        + SUM(IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c), 0))
        AS net_cost
  FROM `project-ID.dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX` as bq
  WHERE TO_JSON_STRING(project.ancestors) like "%resource_name\":\"folders/1234"
  GROUP BY invoice_month, ancestors
  ORDER BY invoice_month, ancestors

UNNEST 方法

SELECT
    invoice.month AS invoice_month,
    TO_JSON_STRING(project.ancestors) as ancestors,
    SUM(cost)
        + SUM(IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c), 0))
        AS net_cost
  FROM `project-ID.dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX` as bq, UNNEST(project.ancestors) as ancestor
  WHERE ancestor.resource_name = "folders/1234"
  GROUP BY invoice_month, ancestors
  ORDER BY invoice_month, ancestors

示例 2:按显示名称过滤

此示例演示的查询按项目祖先实体对费用进行分组,并仅过滤由指定层次结构元素(由用户提供的显示名标识)生成的费用。

字符串匹配方法

SELECT
    invoice.month AS invoice_month,
    TO_JSON_STRING(project.ancestors) as ancestors,
    SUM(cost)
        + SUM(IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c), 0))
        AS net_cost
  FROM `project-ID.dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX` as bq
  WHERE TO_JSON_STRING(project.ancestors) like "%display_name\":\"MyFolderName%"
  GROUP BY invoice_month, ancestors
  ORDER BY invoice_month, ancestors

UNNEST 方法

SELECT
    invoice.month AS invoice_month,
    TO_JSON_STRING(project.ancestors) as ancestors,
    SUM(cost)
        + SUM(IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c), 0))
        AS net_cost
  FROM `project-ID.dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX` as bq, UNNEST(project.ancestors) as ancestor
  WHERE ancestor.display_name = "MyFolderName"
  GROUP BY invoice_month, ancestors
  ORDER BY invoice_month, ancestors

通过标记进行查询的示例

以下示例演示了使用标记查询数据的方法。

使用标记按账单月份计算费用

以下查询演示了如何使用 cost_center 标记按账单月份计算退货费用。

SELECT
  invoice.month AS invoice_month,
  tag.value AS cost_center,
  ROUND((SUM(CAST(cost AS NUMERIC))
    + SUM(IFNULL((SELECT SUM (CAST(c.amount AS NUMERIC))
                  FROM UNNEST(credits) AS c), 0))), 2)
    AS net_cost
FROM `project-ID.dataset.gcp_billing_export_resource_v1_XXXXXX-XXXXXX-XXXXXX`, UNNEST(tags) AS tag
WHERE tag.key = "cost_center" AND tag.namespace = "821092389413"
GROUP BY invoice.month, tag.value
ORDER BY invoice.month, tag.value;

例如,上述查询的结果可能是:

invoice_month cost_center net_cost
1 202208 android_mobile_apps 9.93
2 202208 ios_mobile_apps 9.93
3 202209 android_mobile_apps 25.42
4 202209 ios_mobile_apps 25.4
5 202209 personalization 16.08

查看未标记资源的费用

此查询显示未标记资源的账单总额,按账单月份分组。

SELECT
 invoice.month AS invoice_month,
 ROUND((SUM(CAST(cost AS NUMERIC))
   + SUM(IFNULL((SELECT SUM(CAST(c.amount AS NUMERIC))
                 FROM UNNEST(credits) AS c), 0))), 2)
   AS net_cost
FROM
 `project-ID.dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX`
WHERE "color" NOT IN (SELECT key FROM UNNEST(tags))
GROUP BY invoice_month
ORDER BY invoice_month;

例如,上述查询的结果可能是:

invoice_month net_cost
1 202202 0
2 202203 16.81
3 202204 54.09
4 202205 55.82
5 202206 54.09
6 202207 55.83
7 202208 31.49

其他查询示例

按项目查询指定账单月的费用和赠金

通过提供 2020 年 6 月(格式为 YYYYMM)的特定账单月份,此查询将返回按项目分组的费用和赠金的视图,同时显示项目标签。

标准 SQL

SELECT
  project.name,
  TO_JSON_STRING(project.labels) as project_labels,
  sum(cost) as total_cost,
  SUM(IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c), 0)) as total_credits
FROM `project-ID.dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX`
WHERE invoice.month = "202006"
GROUP BY 1, 2
ORDER BY 1;
Row 名称 project_labels total_cost total_credits
1 CTG - Dev [{"key":"ctg_p_env","value":"dev"}] 79.140979 -4.763796
2 CTG - Prod [{"key":"ctg_p_env","value":"prod"},{"key":"ctg_team","value":"eng"}] 32.466272 -3.073356
3 CTG - Sandbox [{"key":"ctg_p_env","value":"dev"}] 0 0
4 CTG - Storage [{"key":"ctg_p_env","value":"prod"},{"key":"ctg_team","value":"data"}] 7.645793 -0.003761

查询费用以查看指定账单月份的更正或延迟货币化用量

此简化查询通过提供特定账单月份,并按使用日期早于账单月份的日期进行过滤,来返回更正或延迟货币化用量(应计入先前账单的费用)对应的费用总额。

标准 SQL

SELECT
  SUM(cost)
    + SUM(IFNULL((SELECT SUM(c.amount)
      FROM   UNNEST(credits) c), 0))
    AS total
FROM `project-ID.dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX`
WHERE
  invoice.month = '202403' AND
    DATE(TIMESTAMP_TRUNC(usage_start_time, Day, 'US/Pacific')) < '2024-03-01';

例如,上述查询的结果可能是:

Row 总计
1 3.531752

查询费用详细信息以查看指定账单月份的更正或延迟货币化用量(按服务)

此示例演示了一个查询,该查询按服务返回账单费用的费用明细(其中使用日期早于账单月份)。此查询按服务返回更正或延迟货币化用量(应计入先前账单的费用)对应的费用和赠金总额。

在此查询示例中,WHERE 子句过滤账单月份为 2024 年 3 月(格式为 YYYYMM)的所有费用,然后进一步优化结果以便仅返回使用日期早于 2024 年 3 月 1 日的账单月份费用。

SELECT
  DATE(TIMESTAMP_TRUNC(usage_start_time, Day, 'US/Pacific')) AS `Day`,
  service.description AS `Service Description`,
  SUM(CAST(cost_at_list AS NUMERIC)) AS `List cost`,
  SUM(CAST(cost AS NUMERIC)) - SUM(CAST(cost_at_list AS NUMERIC)) AS `Negotiated savings`,
  SUM(IFNULL((SELECT SUM(CAST(c.amount AS numeric)) FROM UNNEST(credits) c WHERE c.type IN ('SUSTAINED_USAGE_DISCOUNT', 'DISCOUNT', 'SPENDING_BASED_DISCOUNT', 'COMMITTED_USAGE_DISCOUNT', 'FREE_TIER', 'COMMITTED_USAGE_DISCOUNT_DOLLAR_BASE', 'SUBSCRIPTION_BENEFIT', 'RESELLER_MARGIN')), 0)) AS `Discounts`,
  SUM(IFNULL((SELECT SUM(CAST(c.amount AS numeric)) FROM UNNEST(credits) c WHERE c.type IN ('CREDIT_TYPE_UNSPECIFIED', 'PROMOTION')), 0)) AS `Promotions and others`,
  SUM(CAST(cost_at_list AS NUMERIC)) + SUM(IFNULL((SELECT SUM(CAST(c.amount AS numeric)) FROM UNNEST(credits) c WHERE c.type IN ('SUSTAINED_USAGE_DISCOUNT', 'DISCOUNT', 'SPENDING_BASED_DISCOUNT', 'COMMITTED_USAGE_DISCOUNT', 'FREE_TIER', 'COMMITTED_USAGE_DISCOUNT_DOLLAR_BASE', 'SUBSCRIPTION_BENEFIT', 'RESELLER_MARGIN')), 0)) + SUM(CAST(cost AS NUMERIC)) - SUM(CAST(cost_at_list AS NUMERIC))+ SUM(IFNULL((SELECT SUM(CAST(c.amount AS numeric)) FROM UNNEST(credits) c WHERE c.type IN ('CREDIT_TYPE_UNSPECIFIED', 'PROMOTION')), 0)) AS `Subtotal`
FROM
  `project-ID.dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX`
WHERE
  invoice.month = '202403' AND
  DATE(TIMESTAMP_TRUNC(usage_start_time, Day, 'US/Pacific')) < '2024-03-01'
GROUP BY
  Day,
  service.description
ORDER BY
  Day DESC,
  Subtotal DESC;

例如,上述查询的结果可能是:

Row 服务说明 定价费用 协议价费用节省 折扣 赠送金额及其他赠金 小计
1 2024-02-29 Compute Engine 4.39916 0 -1.00916 0 3.39000
2 2024-02-29 支持 0.131969 0 0 0 0.131969
3 2024-02-29 BigQuery 0.005502 0 0 0 0.005502
4 2024-02-29 网络 0.010972 0 -0.006691 0 0.004281

详细使用费查询示例

本部分提供了查询导出到 BigQuery 的 Cloud Billing 详细使用费数据的示例。

由于详细使用费架构包含标准使用费架构中的所有字段,因此为导出到 BigQuery 的标准数据提供的查询示例同样适用于导出的详细数据。请注意,标准查询示例并不用于检索详细使用费导出选项提供的任何资源级信息。创建详细数据的查询时,您可以使用标准查询示例作为模板,更新表名称,并添加详细使用费架构中提供的任何字段。

如需详细了解导出的详细数据的要求和限制,请参阅详细使用费数据的架构

详细费用查询示例中使用的常用值

本部分中的查询示例使用以下值作为表名称project-ID.dataset.gcp_billing_export_resource_v1_XXXXXX-XXXXXX-XXXXXX

返回账单中的资源级费用

以下查询演示了使用导出的结算数据查看账单上的资源级费用和赠金值的两种方法。

  • total 字段直接对浮点费用和赠金值求和,可能会产生浮点舍入误差。
  • total_exact 字段在求和之前将费用和赠金值转换为 micros,然后在求和后转换回美元,以避免产生浮点舍入误差。

计算每项资源每个账单的总费用

此查询显示了每个 resource.name 每个月的账单总额,即常规费用、税费、调整项和舍入误差的总和。与资源级项没有关联的所有当月费用都会汇总到名称 null 下。

标准 SQL

SELECT
  invoice.month,
  resource.name,
  SUM(cost)
    + SUM(IFNULL((SELECT SUM(c.amount)
                  FROM UNNEST(credits) c), 0))
    AS total,
  (SUM(CAST(cost AS NUMERIC))
    + SUM(IFNULL((SELECT SUM(CAST(c.amount AS NUMERIC))
                  FROM UNNEST(credits) AS c), 0)))
    AS total_exact
FROM `project-ID.dataset.gcp_billing_export_resource_v1_XXXXXX-XXXXXX-XXXXXX`
GROUP BY 1, 2
ORDER BY 1 ASC, 2 ASC
;

例如,上述查询的结果可能是:

名称 总计 total_exact
1 201901 null $1005.004832999999984 $1005.00
2 201901 backend1 $781.8499760000028 $781.85
3 201902 null $953.0034923645475983 $953.03
4 201902 backend1 $992.3101739999999717 $992.31
5 201902 bitnami-launchpad-wordpress-1-wordpress $1.2817819999999998 $1.28

按费用类型返回每项资源每个账单月的详细信息

此查询显示了每个 resource.name 每个月各 cost_type 的总费用。费用类型包括常规费用、税费、调整项和舍入误差。与资源级项没有关联的所有当月费用都会汇总到名称 null 下。

标准 SQL

SELECT
  invoice.month,
  cost_type,
  resource.name,
  SUM(cost)
    + SUM(IFNULL((SELECT SUM(c.amount)
                  FROM   UNNEST(credits) c), 0))
    AS total,
  (SUM(CAST(cost AS NUMERIC))
    + SUM(IFNULL((SELECT SUM(CAST(c.amount AS NUMERIC))
                  FROM UNNEST(credits) AS c), 0)))
    AS total_exact
FROM `project-ID.dataset.gcp_billing_export_resource_v1_XXXXXX-XXXXXX-XXXXXX`
GROUP BY 1, 2, 3
ORDER BY 1 ASC, 2 ASC, 3 ASC
;

例如,上述查询的结果可能是:

费用类型 名称 总计 total_exact
1 201901 regular null $1000.501209987994782 $1000.50
2 201901 rounding_error null –$0.500489920049387 –$0.50
3 201901 tax null $10.000329958477891 $10.00
4 201901 adjustment null –$5.002572999387045 –$5.00
5 201901 regular backend1 $410.998795012082947 $411.00
2 201901 rounding_error backend1 –$0.2404900489920378 –$0.24
3 201901 tax backend1 $4.105840329977189 $4.11

获取 Google Kubernetes Engine (GKE) 集群费用明细

本部分提供了在 BigQuery 导出报告中过滤 GKE 集群费用的示例。如需详细了解 GKE 集群费用,请参阅查看集群费用明细

过滤 GKE 费用

以下示例查询展示了如何按集群名称、命名空间和标签对所支持资源类型的 GKE 费用进行过滤和分组。

抵扣赠金之前的 GKE 集群费用

SELECT
  SUM(cost) AS cost_before_credits,
  labels.value AS cluster_name
FROM  `project-ID.dataset.gcp_billing_export_resource_v1_XXXXXX-XXXXXX-XXXXXX`
LEFT JOIN UNNEST(labels) as labels
  ON labels.key = "goog-k8s-cluster-name"
GROUP BY labels.value
;

抵扣赠金之后的 GKE 费用(按命名空间)

SELECT
  labels.value as namespace,
  SUM(cost) + SUM(IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c), 0)) AS cost_after_credits,
FROM `project-ID.dataset.gcp_billing_export_resource_v1_XXXXXX-XXXXXX-XXXXXX`
LEFT JOIN UNNEST(labels) as labels
  ON labels.key = "k8s-namespace"
GROUP BY namespace
;

GKE 费用(按 SKU)

SELECT
  project.id AS project_id,
  labels.value AS cluster_name,
  sku.id AS sku_id,
  sku.description AS sku_description,
  SUM(cost) AS cost
FROM `project-ID.dataset.gcp_billing_export_resource_v1_XXXXXX-XXXXXX-XXXXXX`
JOIN UNNEST(labels) AS labels
  ON labels.key = "goog-k8s-cluster-name"
GROUP BY
  cluster_name, project_id, sku_description, sku_id
;

价格数据查询示例

本部分提供了不同的示例,演示如何查询导出到 BigQuery 的 Cloud Billing 价格数据

价格查询示例中使用的常用值

本部分中的查询示例使用以下值:

  • 表名称project-ID.dataset.cloud_pricing_export
  • SKU ID2DA5-55D3-E679(Cloud Run - 请求)

获取特定 SKU 的定价

此示例演示了一个基本查询,该查询针对指定 SKU 的每个价格层级返回 list_price

标准 SQL

SELECT sku.id,  sku.description, list_price.*
FROM `project-ID.dataset.cloud_pricing_export`
WHERE DATE(_PARTITIONTIME) = "2020-07-20"
      AND sku.id = "2DA5-55D3-E679"
;

_PARTITIONTIME 是 BigQuery 自动生成的字段,表示数据所属的日期。您可以使用 Cloud Billing 导出作业明确生成的字段(例如 pricing_as_of_time),而不是使用 _PARTITIONTIME

以下是配置为使用 pricing_as_of_time 字段的同一查询:

SELECT sku.id,  sku.description, list_price.*
FROM `project-ID.dataset.cloud_pricing_export`
WHERE DATE(pricing_as_of_time) = "2020-07-20"
      AND sku.id = "2DA5-55D3-E679"
;

查询结果

id description pricing_unit aggregation_info.
aggregation_level
aggregation_info.
aggregation_interval
tiered_rates.
pricing_unit_quantity
tiered_rates.
start_usage_amount
tiered_rates.
usd_amount
tiered_rates.
account_currency_amount
1 2DA5-55D3-E679 请求 COUNT ACCOUNT MONTHLY 1000000 0 0 0
          1000000 2000000 0.4 0.4

获取特定 SKU 的定价,并包含服务说明

本部分中的两个示例演示了针对指定 SKU 的每个价格层级返回 list_price 的查询,并且包含 SKU 说明和服务说明。

  • 示例 1 针对每行返回一个 SKU,其价格层级显示为嵌套数据。
  • 示例 2 演示了如何将数据解除嵌套,以针对每个价格层级为每个 SKU 返回一行。

示例 1:返回嵌套数据

此示例查询单个 SKU 以返回 list_price 数据。此 SKU 有多个价格层级。定价字段值以嵌套在 SKU ID 这行下方的个别行显示。

标准 SQL

SELECT sku.id AS sku_id,
       sku.description AS sku_description,
       service.id AS service_id,
       service.description as service_description,
       list_price.*
FROM project-ID.dataset.cloud_pricing_export
WHERE DATE(_PARTITIONTIME) = "2020-07-20"
      AND sku.id = "2DA5-55D3-E679"
;

查询结果:

sku_id sku_description service_id service_description aggregation_info.
aggregation_level
aggregation_info.
aggregation_interval
tiered_rates.
pricing_unit_quantity
tiered_rates.
start_usage_amount
tiered_rates.
usd_amount
tiered_rates.
account_currency_amount
1 2DA5-55D3-E679 请求 152E-C115-5142 Cloud Run ACCOUNT MONTHLY 1000000 0 0 0
            1000000 2000000 0.4 0.4

示例 2:返回与同一表联接的未嵌套数据

此示例查询单个 SKU 以返回 list price。SKU 有多个价格层级。该查询演示了如何使用 UNNEST 运算符来展平 tiered_rates 数组,并将各个字段与相同表联接,以便每个价格层级各占一行。

标准 SQL

SELECT sku.id AS sku_id,
       sku.description AS sku_description,
       service.id AS service_id,
       service.description as service_description,
       tier.*
FROM `project-ID.dataset.cloud_pricing_export` as sku_pricing, UNNEST (sku_pricing.list_price.tiered_rates) as tier
WHERE DATE(_PARTITIONTIME) = "2020-07-20"
      AND sku.id = "2DA5-55D3-E679"
;

查询结果:

sku_id sku_description service_id service_description pricing_unit_quantity start_usage_amount usd_amount account_currency_amount
1 2DA5-55D3-E679 请求 152E-C115-5142 Cloud Run 1000000.0 0.0 0.0 0.0
2 2DA5-55D3-E679 请求 152E-C115-5142 Cloud Run 1000000.0 2000000.0 0.4 0.4

使用商品类目和地理类目查询 SKU

  • 产品类目是适用于该 SKU 的产品类别列表,例如“无服务器”、Cloud Run 或“按需虚拟机数”
  • 地理位置类目是应用于 SKU 的地理元数据,它由类型和区域值组成。

获取 SKU 的商品类目

此示例演示了一个针对指定 SKU 返回 product_taxonomy 列表的查询,其中 SKU ID = 2DA5-55D3-E679(Cloud Run - 请求)。

标准 SQL

SELECT sku.id AS sku_id,
       sku.description AS sku_description,
       service.id AS service_id,
       service.description as service_description,
       product_taxonomy
FROM `project-ID.dataset.cloud_pricing_export`
WHERE DATE(_PARTITIONTIME) = "2020-07-20"
      AND sku.id = "2DA5-55D3-E679"
;

查询结果:

sku_id sku_description service_id service_description product_taxonomy
1 2DA5-55D3-E679 请求 152E-C115-5142 Cloud Run GCP
        无服务器
        Cloud Run
        其他

获取特定商品类目的所有 SKU

此示例演示了一个查询,该查询返回与指定的 product_taxonomy 匹配的所有 SKU。在此查询中,我们将无服务器指定为 product taxonomy 值。

标准 SQL

SELECT sku.id AS sku_id,
       sku.description AS sku_description,
       service.id AS service_id,
       service.description as service_description,
       product_taxonomy
FROM `project-ID.dataset.cloud_pricing_export`
WHERE DATE(_PARTITIONTIME) = "2020-07-20"
     AND "Serverless" in UNNEST(product_taxonomy)
LIMIT 10
;

查询结果:

sku_id sku_description service_id service_description product_taxonomy
1 0160-BD7B-4C40 Cloud Tasks 网络内部地区出站流量 F3A6-D7B7-9BDA Cloud Tasks GCP
        无服务器
        Cloud Tasks
        其他
2 FE08-0A74-7AFD Cloud Tasks GOOGLE-API 出站流量 F3A6-D7B7-9BDA Cloud Tasks GCP
        无服务器
        Cloud Tasks
        其他
3 A81A-32A2-B46D 任务队列存储空间盐湖城 F17B-412E-CB64 App Engine GCP
        无服务器
        GAE
        其他
        TaskQueue

获取特定地理类目和商品类目的所有 SKU

此示例演示了一个查询,该查询返回与指定的 geo_taxonomy 地区和指定的 product_taxonomy 匹配的所有 SKU。其中 region = us-east4product_taxonomy = 按需虚拟机数

标准 SQL

SELECT sku.id AS sku_id,
       sku.description AS sku_description,
       service.id AS service_id,
       service.description as service_description,
       geo_taxonomy,
       product_taxonomy
FROM `project-ID.dataset.cloud_pricing_export`
WHERE DATE(_PARTITIONTIME) = "2020-07-20"
      AND "VMs On Demand" in UNNEST(product_taxonomy)
      AND geo_taxonomy.type = "REGIONAL"
      AND "us-east4" in UNNEST (geo_taxonomy.regions)
;

查询结果:

sku_id sku_description service_id service_description geo_taxonomy.type geo_taxonomy.regions product_taxonomy
1 9174-81EE-425B 在弗吉尼亚运行的单租户实例 RAM 的单租户附加费 6F81-5844-456A Compute Engine REGIONAL us-east4 GCP
            计算
            GCE
            按需虚拟机数
            内存:每 GB
2 C3B9-E891-85ED 在弗吉尼亚州运行的单租户实例 RAM 6F81-5844-456A Compute Engine REGIONAL us-east4 GCP
            计算
            GCE
            按需虚拟机数
            内存:每 GB
3 6E2A-DCD9-87ED 在弗吉尼亚运行的 N1 预定义实例 RAM 6F81-5844-456A Compute Engine REGIONAL us-east4 GCP
            计算
            GCE
            按需虚拟机数
            内存:每 GB

将价格数据与详细的使用费用数据联接

此查询展示如何将价格和费用数据导出联接,以根据您的费用查看详细的价格信息。您可以配置此查询,以从详细使用费数据中拉取导出的数据(作为 Exports),并将使用费数据与导出的价格数据(作为 Prices)联接。

使用详细使用费表名称拉取 Exports 数据:gcp_billing_export_resource_v1_<BILLING_ACCOUNT_ID>

价格表名称用于 Prices 数据:project-ID.dataset.cloud_pricing_export

WITH
  Exports AS (
    SELECT *
    FROM `project-ID.dataset.gcp_billing_export_resource_v1_XXXXXX-XXXXXX-XXXXXX`
  ),
  Prices AS (
    SELECT *
    FROM `project-ID.dataset.cloud_pricing_export`
  )
SELECT
  Exports.sku.description AS sku_description,
  Exports.cost,
  Exports.usage,
  FlattenedPrices.pricing_unit_description,
  FlattenedPrices.account_currency_amount,
  FlattenedPrices.account_currency_code,
FROM Exports
JOIN (SELECT * FROM Prices CROSS JOIN UNNEST(Prices.list_price.tiered_rates)) AS FlattenedPrices
  ON
    Exports.sku.id = FlattenedPrices.sku.id
    AND Exports.price.tier_start_amount = FlattenedPrices.start_usage_amount
WHERE
  DATE(Exports.export_time) = '2023-06-30'
  AND DATE(FlattenedPrices.export_time) = '2023-06-30'
  AND cost > 0
LIMIT 1000

例如,上述查询的结果可能是:

sku_description 费用 使用量 pricing_unit_description account_currency_amount account_currency_code
平衡永久性磁盘容量 0.001345 { "usage": { "amount": "38654705664000.0", "unit": "byte-seconds", "amount_in_pricing_units": "0.01345895", "pricing_unit": "gibibyte month" } } GiB/月 0.1 美元
平衡永久性磁盘容量 0.001344 { "usage": { "amount": "38654705664000.0", "unit": "byte-seconds", "amount_in_pricing_units": "0.01345895", "pricing_unit": "gibibyte month" } } GiB/月 0.1 美元
平衡永久性磁盘容量 0.001346 { "usage": { "amount": "38654705664000.0", "unit": "byte-seconds", "amount_in_pricing_units": "0.01345895", "pricing_unit": "gibibyte month" } } GiB/月 0.1 美元