首页 > 解决方案 > 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 美分

所以现在我正在尝试为该表汇总一些数据

我想得到

这是我的查询:

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

现在我得到了我期望的结果。我想了解我们是否可以在不使用子查询且仅使用联接的情况下做到这一点?

标签: sqljoingoogle-bigquery

解决方案


下面是 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)与原始查询中的子查询类型不同。而是在这里为每一行查询其数组以查找该行中的金额总和,然后将其汇总为总和......
希望你明白


推荐阅读