Big Query中聚合发票编号与金额至单行的实现问题
问题描述
现有数据
| budget_id | invoice_number | April | June | August |
|---|---|---|---|---|
| 004 | 11 | NULL | 690 | NULL |
| 004 | 12 | 1820 | NULL | NULL |
| 004 | 13 | NULL | NULL | 890 |
期望结果
| budget_id | invoice_number | April | June | August |
|---|---|---|---|---|
| 004 | 11, 12, 13 | 1820 | 690 | 890 |
尝试的SQL(无效果)
SELECT budget_id, STRING_AGG(invoice_number, ',') AS invoice number, April, June, August FROM invoice_table GROUP BY budget_id, April, June, August
注释掉月份字段时,能正常聚合发票编号,但包含月份字段后仍得到3条独立数据行。需要在合并发票编号的同时保留对应月份的金额,请问在Big Query中是否可以实现该需求?
解决方案
可以实现,问题核心是GROUP BY子句包含了月份字段。原数据中每行的月份字段都是互斥的NULL值,分组时会将这三行判定为不同分组,因此无法合并成一行。
正确的写法是对月份字段使用聚合函数(如MAX()),同一budget_id下每个月份仅存在一个非NULL值,取最大值即可保留有效金额,同时仅按budget_id分组:
SELECT budget_id, STRING_AGG(invoice_number, ', ') AS invoice_number, MAX(April) AS April, MAX(June) AS June, MAX(August) AS August FROM invoice_table GROUP BY budget_id
关键说明
STRING_AGG(invoice_number, ', '):将同一budget_id下的所有发票编号用逗号加空格拼接MAX(月份字段):自动忽略NULL值,保留对应月份的唯一有效金额- 仅按
budget_id分组,确保同一budget_id的所有数据合并为单行
内容的提问来源于stack exchange,提问作者runner16
相关产品推荐
相关产品推荐

