我有一个电子表格(https://docs.google.com/spreadsheets/d/1R0zYMAigDULzm8oM2icsPK55BP162kVvctpx2cOSOIE/edit?usp=sharing)我每次访问商店时都会在每行输入Groceries。
我创建了一个查询来输出所有行的每个商店的总和。这很有效。
=QUERY(A9:C,
"select C,
SUM(B)
where B is not null
GROUP BY C
LABEL C '', SUM(B) ''")
现在我想使用几乎相同的查询,但我想将其限制为仅对过去六个月的条目求和。这是我的问题:
=QUERY(A9:C,
"select C,
SUM(B)
where date '2016-08-28' < A
GROUP BY C
LABEL C '', SUM(B) ''")
这也很好用,除了我想让它列出所有商店,如果没有商店的条目(例如Bristol Farms和Safeway在这个例子中),那么我想要的不是省略它它显示为0。
所以我希望它显示如下:
我该怎么做?
答案 0 :(得分:1)
好问题!
我认为,跳过零结果的行是query
函数的自然行为。我的建议是使用条件相反且没有标题的第二个查询。
<强>步骤1。原始查询
假设我们有小表,如下所示:
Name Sum
Ma 10
Mu 20
Mo 30
Mi 40
任务是获取所有行&cum; 10:
=QUERY({D83:E87},"select Col1, Col2 where Col2 > 10")
结果是:
Name Sum
Mu 20
Mo 30
Mi 40
<强>第二步。相反的查询
让我们以相反的条件进行另一个查询:
=QUERY({D83:E87},"select Col1, 0 where Col2 <= 10 label Col1 '', 0 ''")
结果是:
Ma 0
在此查询中:
select Col1, 0
为所有行提供零label Col1 '', 0 ''
跳过标题<强>步骤3。组合强>
最后要做的是将公式合并为单个数组{}
:
={QUERY({D83:E87},"select Col1, Col2 where Col2 > 10");QUERY({D83:E87},"select Col1, 0 where Col2 <= 10 label Col1 '', 0 ''")}
结果:
Name Sum
Mu 20
Mo 30
Mi 40
Ma 0
关于提供的解决方案的坏处是零将在结果的最后。
在您的情况下,最终的公式是:
={QUERY(A9:C,
"select C,
SUM(B)
where date '2016-08-28' < A
GROUP BY C
LABEL C '', SUM(B) ''");
UNIQUE(QUERY(A9:C,
"select C,
0
where date '2016-08-28' >= A and A is not null
LABEL C '', 0 ''"))}
我使用unique
函数,因为Google Sheet SQL不包含distinct
optoin。
结果:
Ralphs 120
Walmart 350
Bristol Farms 0
Safeway 0
获得唯一和零的另一种方法是这个公式:
={QUERY(A9:C,
"select C,
SUM(B)
where date '2016-08-28' < A
GROUP BY C
LABEL C '', SUM(B) ''");
QUERY(A9:C,
"select C,
sum(B) - sum(B)
where date '2016-08-28' >= A and B > 0
group by C
LABEL C '', sum(B) - sum(B) ''")}
sum(B) - sum(B)
给出了零group by C
提供独特的where date '2016-08-28'
是相反的条件and B > 0
用于剪切空结果。答案 1 :(得分:1)
如果您不介意额外的列(可以隐藏它),请在电子表格中将其放入J9:
=ARRAYFORMULA(if(A9:A13>Date(2016,8,28),B9:B13,0))
这在K11:
=QUERY(A9:J13,"select C, sum(J) group by C order by C label sum(J)''")
我无法让Max的答案与sum一起工作。也许你可以。