如何使用子查询或其他方法向此 bigquery/sql 查询添加新列

How to add a new column to this bigquery/sql query using a subquery or other method

提问人:learner_one 提问时间:11/4/2023 最后编辑:learner_one 更新时间:11/7/2023 访问量:75

问:

我创建了这个查询:

SELECT
  country,
  place,
  label_date,
  SUM(CASE
      WHEN Category = 'cat1' THEN Value
    ELSE
    0
  END
    ) AS t_s,
  SUM(CASE
      WHEN Category = 'cat2' THEN Value
    ELSE
    0
  END
    ) AS non_ps,
  SUM(CASE
      WHEN Category = 'cat3' THEN Value
    ELSE
    0
  END
    ) AS f_h,
  SUM(CASE
      WHEN Category = 'cat4' THEN Value
    ELSE
    0
  END) AS f_s,
  SUM(CASE
      WHEN Category = 'cat5' THEN Value
    ELSE
    0
  END) AS o_hp,
  SUM(CASE
      WHEN Category = 'cat6' THEN Value
    ELSE
    0
  END) AS o_hps,
  SUM(CASE
      WHEN Category = 'cat7' THEN Value
    ELSE
    0
  END) AS a_s,
  SUM(CASE
      WHEN Category = 'cat8' THEN Value
    ELSE
    0
  END) AS u_s
FROM
  `my_database`
where country is not null group by country, place, label_date order by country desc

我使用聚合是因为我需要避免使用空和零。像这样,而不是这样

现在我有另一个查询:

 select country, place, label_date, if((sum(value)/count(Value))=0,1,sum(value)/count(Value)) as s_u from `my_database` where Category = 'cat9' group by country, place, label_date

我想添加它,但我不能。

我试过做这个连接:

FROM
  `my_database` as main
JOIN(select country, place, label_date, if((sum(value)/count(Value))=0,1,sum(value)/count(Value)) as s_u from `my_database` where Category = 'cat9' group by country, place, label_date) as s_u ON main.country = s_u.country
where country is not null group by country, place, label_date order by country desc

我使用了国家/地区,因为遗憾的是我没有唯一的 ID,但我得到错误国家/地区是多余的。

我也试过这个:

SUM(CASE
      WHEN Category = 'cat8' THEN Value
    ELSE
    0
  END) AS u_s,
SUM(CASE
      WHEN Category = 'cat9' THEN if((sum(value)/count(Value))=0,1,sum(value)/count(Value))
    ELSE
    0
  END) AS u_s
FROM
  `my_database`
where country is not null group by country, place, label_date order by country desc

但现在我得到了一个可以聚合聚合的错误。

编辑以添加示例数据:

我需要以这种方式获得数据,而不是像这样超过一行的国家/地区显示。

如果我再添加一个没有聚合的情况,bigquery 将显示以下内容:选择既不分组也不聚合的列表表达式引用

sql google-bigquery 子查询

评论

0赞 philipxy 11/7/2023
请提出 1 个经过研究的非重复问题。请询问 1 个错误的查询/函数,并提供强制性的最小可重现示例,包括为什么您认为它应该返回其他内容,或者不确定在第一个子表达式中您没有得到您期望或卡住的地方,通过参考权威文档进行证明,或者询问您的总体目标,给出您可以用理由和最小可现示例来做的工作部分--那么被误解的代码就不属于了。但是,请首先询问意外行为,因为误解会妨碍您的目标。如何咨询帮助中心 基本问题是常见问题解答。
0赞 philipxy 11/7/2023
把所有需要问的东西都放在你的帖子中,而不仅仅是在一个链接上。使用文本来表示可以通过文本给出的内容。为什么我不应该上传代码/数据/错误的图像?
0赞 philipxy 11/7/2023
两个 SQL LEFT JOINS 产生不正确的结果等,这是一个常见问题解答。但是,人们必须通过一个最小的可重复的例子来确定,并写出许多清晰、简洁和精确的措辞来说明一个人的问题/问题/目标,以便合理地进行搜索。预计会有多少研究工作?PS 当您编辑帖子以吸引焦点时,不要让合理的发布答案无效。PS 是否有任何经验法则可以从人类可读的描述中构建SQL查询?

答:

0赞 digital.aaron 11/4/2023 #1

此处可能需要采取的方法是拆分聚合,并对记录 where 和非 null 国家/地区值进行一些计算。Category = 'cat9'

我们将计算这些记录,并按国家/地区、地点和label_date分组,就像您的第一个查询一样,以及 .然后,我们将原始的第一个查询放在另一个聚合的 CTE 中,然后在最后选择并将它们连接在一起,同时添加用于计算的条件逻辑。COUNT()SUM(value)s_u

WITH Cat9s AS
(
    SELECT 
        country
        , place
        , label_date
        , COUNT(*) AS TotalCat9s
        , SUM(IFNULL(value,0)) AS Cat9Sum
    FROM `my_database` 
    WHERE Category = 'cat9' 
    AND country IS NOT NULL
    GROUP BY country
        , place
        , label_date
)
,Aggregations AS
(
    SELECT
      country,
      place,
      label_date,
      SUM(CASE
          WHEN Category = 'cat1' THEN Value
        ELSE
        0
      END
        ) AS t_s,
      SUM(CASE
          WHEN Category = 'cat2' THEN Value
        ELSE
        0
      END
        ) AS non_ps,
      SUM(CASE
          WHEN Category = 'cat3' THEN Value
        ELSE
        0
      END
        ) AS f_h,
      SUM(CASE
          WHEN Category = 'cat4' THEN Value
        ELSE
        0
      END) AS f_s,
      SUM(CASE
          WHEN Category = 'cat5' THEN Value
        ELSE
        0
      END) AS o_hp,
      SUM(CASE
          WHEN Category = 'cat6' THEN Value
        ELSE
        0
      END) AS o_hps,
      SUM(CASE
          WHEN Category = 'cat7' THEN Value
        ELSE
        0
      END) AS a_s,
      SUM(CASE
          WHEN Category = 'cat8' THEN Value
        ELSE
        0
      END) AS u_s
    FROM
      `my_database`
    where country is not null 
    GROUP by country, place, label_date
)
SELECT 
    a.country
    ,a.place
    ,a.label_date
    ,a.t_s
    ,a.non_ps
    ,a.f_h
    ,a.f_s
    ,a.o_hp
    ,a.o_hps
    ,a.a_s
    ,a.u_s
    ,CASE WHEN c.Cat9Sum = 0 THEN 1 
            WHEN c.Cat9Sum <> 0 THEN c.Cat9Sum / c.TotalCat9s
        ELSE NULL END AS s_u
FROM Aggregations a
LEFT JOIN Cat9s c ON a.country = c.country 
        AND a.place = c.place
        AND a.label_date = c.label_date

评论

0赞 digital.aaron 11/4/2023
@learner_one 如果您添加一些示例数据,特别是导致重复的数据,我可以帮助您进一步优化查询。