我有一个单子查询,几乎可以达到我想要的目的,但我需要一点帮助来完成最后一步。
=QUERY(Sales!$A$2:$C,"SELECT B, SUM(C)
WHERE A='"&B3&"'
GROUP BY B
ORDER BY SUM(C) DESC
LIMIT 3
LABEL SUM(C) ''
FORMAT SUM(C) '$##,##0' "
,0)
这给我的结果是C3:D4。我想要的是在E3中。我有两个目标。首先输出像E3单元格中那样堆叠和连接的数据。第二,理想的解决方案是在C3中用数组公式为所有的 "伙伴 "做这个工作。示例数据 一如既往地感谢大家的帮助和教育!我有一个sheet查询,几乎可以做到我想要的,但我需要一点帮助来完成最后一步。
这是我解决的方法。也许不是最佳解决方案,因为我需要重复计算,但它完全满足我的需要。我已经将我的解决方案添加到了示例数据中。
=REGEXREPLACE(REGEXREPLACE(textjoin(" ♦ ",0, QUERY({Sales!$A$2:$A,Sales!$B$2:$B,Sales!$C$2:$C}, "SELECT Col2, SUM(Col3) WHERE Col1='"&B3&"' GROUP BY Col2 ORDER BY SUM(Col3) DESC LIMIT 3 LABEL SUM(Col3) '' FORMAT SUM(Col3) '$##,##0' " 。 ,0))," ♦ $\$"," = \$")," ♦ ",CHAR(10))
实现这一目标的方法之一是创建一个 自定义功能 在谷歌应用脚本中。要实现这一点,请按照以下步骤进行。
function GET_TOP_CUSTOMERS(partners) {
const sheet = SpreadsheetApp.getActive().getSheetByName("Sales");
const data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 3).getValues();
return partners.map(row => row[0]).map(partner => {
const partnerRows = data.filter(row => row[0] === partner);
const uniqueCustomers = [...new Set(partnerRows.map(row => row[1]))];
const topCustomers = uniqueCustomers.map(customer => {
return [customer, partnerRows.filter(row => row[1] === customer)
.reduce((acc, current) => {
return acc + current[2] }, 0)];
}).sort((a,b) => b[1] - a[1]).slice(0, 3);
return topCustomers.map(customer => customer[0] + "; $" + customer[1].toFixed())
.join("\n");
});
}
B3:B12
),你可以在这里看到。