如何用Google Query结合IF与SUM将多行数据合并为单行
问题描述
我们从项目管理软件中导出了如下原始工时数据:
| Month | Project | Billable | Time |
|---|---|---|---|
| Jan 2022 | Project 1 | Yes | 100 |
| Jan 2022 | Project 1 | No | 10 |
| Feb 2022 | Project 1 | Yes | 80 |
| Feb 2022 | Project 1 | No | 30 |
| Jan 2022 | Project 2 | Yes | 60 |
| Jan 2022 | Project 2 | No | 5 |
| Feb 2022 | Project 2 | Yes | 90 |
| Feb 2022 | Project 2 | No | 15 |
需要将其转换为以下汇总格式:
| Month | Project | Billable Time | Non-Billable Time | Total Time |
|---|---|---|---|---|
| Jan 2022 | Project 1 | 100 | 10 | 110 |
| Feb 2022 | Project 1 | 80 | 30 | 110 |
| Jan 2022 | Project 2 | 60 | 5 | 65 |
| Feb 2022 | Project 2 | 90 | 15 | 105 |
已将原始数据导入Google Sheet,尝试使用Google Query初始公式:=QUERY(dataRange,"SELECT Month,Project,SUM(Time) GROUP BY Month, Project")
但无法实现区分计费/非计费工时并将求和结果放在同一行,现咨询:
- 是否可通过Google Query实现该需求?
- 若可行,正确的语法是什么?
- 若不可行,应采用何种替代方法?
解决方案
可以通过Google Query实现该需求,核心是利用条件求和(
SUM(CASE WHEN...))语法拆分计费与非计费工时。正确的Google Query公式:
假设原始数据表头在A1单元格,数据范围为A1:D9,公式如下:
=QUERY(A1:D9, "SELECT A,B,SUM(CASE WHEN C='Yes' THEN D ELSE 0 END),SUM(CASE WHEN C='No' THEN D ELSE 0 END),SUM(D) WHERE A IS NOT NULL GROUP BY A,B LABEL SUM(CASE WHEN C='Yes' THEN D ELSE 0 END) 'Billable Time', SUM(CASE WHEN C='No' THEN D ELSE 0 END) 'Non-Billable Time', SUM(D) 'Total Time'")
如果使用命名范围dataRange(包含表头),公式可改为:
=QUERY(dataRange, "SELECT Col1,Col2,SUM(CASE WHEN Col3='Yes' THEN Col4 ELSE 0 END),SUM(CASE WHEN Col3='No' THEN Col4 ELSE 0 END),SUM(Col4) WHERE Col1 IS NOT NULL GROUP BY Col1,Col2 LABEL SUM(CASE WHEN Col3='Yes' THEN Col4 ELSE 0 END) 'Billable Time', SUM(CASE WHEN Col3='No' THEN Col4 ELSE 0 END) 'Non-Billable Time', SUM(Col4) 'Total Time'")
- 逻辑说明:
- 用
CASE WHEN判断Billable列的值,分别对Time列进行条件求和,得到计费/非计费工时 GROUP BY Col1,Col2(即Month和Project)将同一月份同一项目的记录合并到一行LABEL子句用于自定义输出列的表头,匹配目标格式
- 用
- 替代方法(若Query语法不易维护):
- 使用数据透视表:
- 选中原始数据区域,点击菜单栏「数据」→「数据透视表」
- 行:添加「Month」和「Project」
- 值:添加三次「Time」,分别设置:
- 第一个值字段:筛选「Billable=Yes」,自定义名称为「Billable Time」
- 第二个值字段:筛选「Billable=No」,自定义名称为「Non-Billable Time」
- 第三个值字段:直接求和,自定义名称为「Total Time」
- 使用数组公式组合SUMIFS:
先提取唯一的Month+Project组合,再用SUMIFS分别计算各部分工时:
注:公式中=ARRAYFORMULA( LET( uniquePairs, UNIQUE(A2:A9&B2:B9), months, INDEX(SPLIT(uniquePairs, CHAR(9))), projects, INDEX(SPLIT(uniquePairs, CHAR(9)),,2), billable, SUMIFS(D2:D9,A2:A9,months,B2:B9,projects,C2:C9,"Yes"), nonBillable, SUMIFS(D2:D9,A2:A9,months,B2:B9,projects,C2:C9,"No"), total, billable+nonBillable, HSTACK(months, projects, billable, nonBillable, total) ) )CHAR(9)是制表符,用于拆分组合后的字符串,确保Month和Project能正确分离。
内容的提问来源于stack exchange,提问作者BaronGrivet
相关产品推荐
相关产品推荐

