Google BigQuery - 根据另一列中的值减去一列的总和

Google BigQuery - Subtract SUMs of a column basing on values in another column

您好,我需要 1 个查询才能获得 2019 年 goods_type 药品中 country 最大 [总数(import) - 总数(export)] - 2020.

数据样本如下:

year | trading_type | country | goods_type | amount
2020   import         ABC       medicines    12345.67
2017   import         ABC       medicines    null
2019   export         DEF       foods        987.65
2018   export         ABC       foods        2345.6
2016   export         DEF       medicines    120.3
2019   export         ABC       medicines    345.67
2020   import         DEF       foods        321.04
...    ...            ...       ...          ...

返回的数据应包含countrygoods_type以及[total(imports) - total(export)].[=22=的值]

我想出了下面的查询,但我不知道它是对还是错,我努力扩展它以获取其他列。我在 Google BigQuery 控制台中收到一条错误提示 select expression column ... not grouped or aggregated...

SELECT country, year FROM `trading_records` T    <--- error here for the year
WHERE
    T.product_type = 'medicines' AND
    (T.year = 2019 OR T.year = 2020)
GROUP BY T.country
ORDER BY (
    (SELECT SUM(amount) FROM `trading_records`
    WHERE trading_type = 'import' AND country = T.country)
    -
    (SELECT SUM(amount) FROM `trading_records`
    WHERE trading_type = 'export' AND country = T.country)
) DESC
LIMIT 10;

感谢您的帮助!谢谢。

您可以尝试使用条件求和。例如 SUM(IF(Condition, true_value, false_value)。这将首先评估您的 Condition。如果它是 True,则 true_value(在本例中是金额)将被包括在内在 SUM 中。如果计算结果为 False,则将 0 添加到 SUM。

这会给你想要的

SELECT country, goods_type, SUM(IF(trading_type='import', amount, 0)) - SUM(IF(trading_type='export', amount, 0)) as import_minus_export
FROM `trading_records`
WHERE goods_type='medicines' AND year IN (2019, 2020)
GROUP BY 1, 2
ORDER BY 2 DESC 
LIMIT 10

我确定还有其他方法,但此查询可以满足您的需求:

WITH data as (
    SELECT 2020 as year, "import" as trading_type, "ABC" as country, 
                       "medicines" as goods_type, 12345.67 as amount UNION ALL
    SELECT 2019, "import", "ABC", "medicines", null UNION ALL
    SELECT 2019, "export", "DEF", "foods", 987.65 UNION ALL
    SELECT 2018, "export", "ABC", "foods", 2345.6 UNION ALL
    SELECT 2016, "export", "DEF", "medicines", 120.3 UNION ALL
    SELECT 2019, "export", "ABC", "medicines", 345.67 UNION ALL
    SELECT 2020, "import", "DEF", "foods", 321.04)

,agg_data as ( 
SELECT year, 
       country, 
       IF(trading_type = "import", amount, amount * -1) as total 
FROM data 
WHERE goods_type = "medicines" AND year in (2019,2020) 
)

SELECT country, SUM(total) as total 
FROM agg_data
GROUP BY country
LIMIT 1

您应该将最后的 LIMIT 1 更改为 10

结果: 美国广播公司 12000.0

您可以使用 GROUP BY、过滤和条件聚合将其表示为单个查询:

SELECT country, 
       SUM(CASE WHEN trading_type = 'import' THEN amount ELSE - amount END) as total 
FROM data 
WHERE trading_type in ('import', 'export') AND
      goods_type = 'medicines' AND
      year >= 2019 AND
      year <= 2020
GROUP BY country
ORDER BY total DESC
LIMIT 10;

请注意,这不包括 SELECT 中的 YEAR,因为它是“汇总的”。