将结算数据导出至 BigQuery 查询的示例

以下是一些示例,展示了如何对导出的结算数据使用 BigQuery 查询。

返回帐单总费用

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

  • 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 * 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
;

例如,上述查询的结果可能如下所示:

总计 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
;

例如,上述查询的结果可能如下所示:

费用类型 总计 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.dataset.table`;

旧版 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.dataset.table`
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.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;
环境 费用
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;
费用
1 null null $4
2 app chocolate-masher $9
3 app grapefruit-squeezer $11
4 environment dev $5
5 environment prod $15
总计 $44

请注意,总费用大于您的帐单费用。

此页内容是否有用?请给出您的反馈和评价: