sql - google bigQuery 子查询加入
问题描述
我有下表。我的表的基本简化版本。我需要汇总几列,我将解释我正在尝试做什么以及我到目前为止所写的内容。
表名
food.id STRING NULLABLE
food.basket.id STRING NULLABLE
food.foodType STRING NULLABLE
food.price INTEGER NULLABLE
food.printed BOOLEAN NULLABLE
food.variations RECORD REPEATED
food.variations.id INTEGER REPEATED
food.variations.amount INTEGER NULLABLE
Sample data
id basket.id. foodType. price. printed. variations.id variations.amount
1. abbcd. JUNK. 100. TRUE. NULL. NULL
2. cdefg. PIZZA. 200. TRUE. 1234. 10
2345. 20
5678. 20
3. abbcd. JUNK. 200. FALSE. 1234. 10
4. uiwka. TOAST. 500. FALSE. NULL. NULL
变化可以像披萨浇头一样,每个变化都有一个数量,比如为简单起见,蔬菜浇头成本 10 美分,肉类浇头成本 20 美分
所以现在我正在尝试为该表汇总一些数据
我想得到
- 打印的项目数(打印的项目 = TRUE)
- 未打印的项目数(打印的项目 = FALSE)
- 所有项目的总成本
- 所有变体的总价
- 特定 foodType 的唯一篮子总数
这是我的查询:
select SUM(CASE When item.printed = TRUE Then 1 Else 0 End ) as printed,
SUM(CASE When item.printed = FALSE Then 1 Else 0 End) as nonPrinted,
SUM(item.price) as price,
(select COUNT(DISTINCT(item.basket.id)) from tableName where itemType = "JUNK") AS baskets,
(select SUM(CASE when m.amount is NULL then 0 Else m.amount END) as variations_total from tableName, UNNEST(item.variations) as m) as variations
from tableName;
printed. unprinted. price. baskets. variations.
2. 2. 1000. 1. 60
现在我得到了我期望的结果。我想了解我们是否可以在不使用子查询且仅使用联接的情况下做到这一点?
解决方案
下面是 BigQuery 标准 SQL 并假设您的查询确实有效(这样说是因为您的数据示例不完全适合您提供的查询)
所以,下面的两个子查询
(select COUNT(DISTINCT(item.basket.id)) from tableName where itemType = "JUNK") AS baskets,
(select SUM(CASE when m.amount is NULL then 0 Else m.amount END) as variations_total from tableName, UNNEST(item.variations) as m) as variations
可以替换为
COUNT(DISTINCT IF(itemType = "JUNK", item.basket.id, NULL)) AS baskets,
SUM((SELECT SUM(amount) FROM item.variations)) AS variations
信不信由你——但结果是一样的
Row printed nonPrinted price baskets variations
1 2 2 1000 1 60
所以,正如你所看到的,你不需要子查询,你也不需要在这里加入
注意:在第二行中 -(SELECT SUM(amount) FROM item.variations)
与原始查询中的子查询类型不同。而是在这里为每一行查询其数组以查找该行中的金额总和,然后将其汇总为总和......
希望你明白
推荐阅读
- python - 从 NumPy 数组中删除时间戳
- node.js - 分叉电子过程需要“空”电子
- java - 使用 spring 数据存储库而不是生成的轴突存储库
- firebase - ChangeNotifier 过早地处理模型
- datagrid - 每次在表单 IO 数据网格中触发行数据的单击事件时,如何发送唯一的行索引?
- qt - 在Qt中使用返回双数组的java方法
- python - 将行列表转换为 PySpark 数据框
- c++ - 声明减少向量,在 1 个线程上运行与没有 openmp 的结果不同
- node.js - 从外部 Node.js 实例使用 Cloud SQL 时,您将如何解决 [DEP0123] 弃用警告?
- python - 如何使用 pandas 创建响应式 Excel 文档标题?