我有一个注册表,其所有交易都包含其帐户ID。该寄存器有一个“类型”字段,我想在其上提取摘要数据。
交易:
| A | B | C | D |
|---------|---------|-------------|------------|
| Account | Amount | Type | Date |
|---------|---------|-------------|------------|
| 1b6f | 44.21 | Charge | 2016-09-01 |
| 5g0p | 101.57 | Charge | 2016-09-01 |
| 5g0p | 21.53 | Upgrade Fee | 2016-09-01 |
| 5g0p | -123.10 | Payment | 2016-09-07 |
| 1b6f | 4.43 | Late Fee | 2016-10-01 |
| 1b6f | 4.87 | Late Fee | 2016-11-01 |
我想要一个允许我提取以下所有摘要信息的查询
Account
Current Balance
Total Charges
Last Charge Date
First Charge Date
Total Fees
Last Fee Date
Total Payments
Last Payment Date
这样的事情:
=QUERY(
A:D,
"SELECT A,
SUM(B),
SUM(FILTER(D:D,C:C='Charge')),
MAX(FILTER(D:D,C:C='Charge')),
MIN(FILTER(D:D,C:C='Charge')),
SUM(FILTER(B:B,ISNUMBER(FIND('Fee',C)))),
MAX(FILTER(D:D,ISNUMBER(FIND('Fee',C)))),
SUM(FILTER(B:B,C:C='Payment')),
MAX(FILTER(D:D,C:C='Payment'))
GROUP BY A
label
A 'Account',
SUM(B) 'Current Balance',
SUM(FILTER(D:D,C:C='Charge')) 'Total Charges',
MAX(FILTER(D:D,C:C='Charge')) 'Last Charge Date',
MIN(FILTER(D:D,C:C='Charge')) 'First Charge Date',
SUM(FILTER(B:B,ISNUMBER(FIND('Fee',C)))) 'Total Fees',
MAX(FILTER(D:D,ISNUMBER(FIND('Fee',C)))) 'Last Fee Date',
SUM(FILTER(B:B,C:C='Payment')) 'Total Payments',
MAX(FILTER(D:D,C:C='Payment')) 'Last Payment Date'
"
)
使用这些结果
| Account | Current Balance | Total Charges | Last Charge Date | First Charge Date | Total Fees | Last Fee Date | Total Payments | Last Payment Date |
|---------|-----------------|---------------|------------------|-------------------|------------|---------------|----------------|-------------------|
| 1b6f | 53.51 | 44.21 | 2016-09-01 | 2016-09-01 | 9.30 | 2016-11-01 | 0 | |
| 5g0p | 121.55 | 223.12 | 2016-10-01 | 2016-09-01 | 21.53 | 2016-09-01 | -123.10 | 2016-09-07 |
不幸的是,MAX
requires input of of a column identifier似乎你根本不能使用任何非标量函数(例如FILTER
)甚至任何未列出的聚合函数(例如JOIN
)
我目前正在使用一堆具有不同WHERE参数的单独查询,但它非常慢。
答案 0 :(得分:0)
@ trex005我为你创建了表
答案在这里:https://docs.google.com/spreadsheets/d/1oC9RYfZD4ITnVfksIVFbC0KkadtFma-JUVk2PdiXqIA/edit?usp=sharing
主要公式的样本是:
=SUMPRODUCT(FILTER(Sheet1!$B$2:$B,Sheet1!$A$2:$A=$A2,Sheet1!$C$2:$C="Charge"))
它会自动将Sheet1中的新ID添加到Sheet2并对其进行计数。 我使用谷歌表格的相同方式来计算我的工资。使用谷歌表单这种方式非常有效
"费用"的最后日期的公式:
=MAX(FILTER(Sheet1!$D$2:$D,Sheet1!$A$2:$A=$A2,Sheet1!$C$2:$C="Charge"))
其中A2:A是
=UNIQUE(Sheet1!A2:A)
答案 1 :(得分:0)
Pivot是一个选项:
=QUERY(A:D,"select A, max(D), min(D), sum(B) where B is not null group by A pivot C",0)
但它不会给总计。
答案 2 :(得分:0)
在Google表格中,无法使用唯一的QUERY来获得所需的结果。一种解决方案是优化您的单独查询集
正如您已经提到的,Google查询语言不支持非标量值作为聚合函数的参数。
优化查询的一种方法是使用FILTER从没有WHERE子句的查询中删除源数组中的空行。
实施例
=QUERY(
FILTER(A:D,LEN(A:A),
"SELECT A, SUM(B) LABEL A 'Current Balance' SUM(B)' Total Charges'"
)
然后,您可以使用数组sintax
加入所有查询的结果={query1,query2}