使用Google Query功能进行FTR计算 Apps脚本的参考资料

问题描述

我正在尝试使用pivot tables创建交叉表Google Query function,以根据First Time Resolution (FTR) ratenumber of Issues received while booking Opportunities计算员工Total Opportunities booked

+---------+-------+---------+-----------+--------+-------+
| OppName | OppID | EmpName | MonthYear | Status | Issue |
+=========+=======+=========+===========+========+=======+
| abc     | 1000  | alex    | 2020-Jan  | active | yes   |
+---------+-------+---------+-----------+--------+-------+
| def     | 1001  | alex    | 2020-Jan  | won    | yes   |
+---------+-------+---------+-----------+--------+-------+
| ghi     | 1002  | alex    | 2020-Feb  | active | no    |
+---------+-------+---------+-----------+--------+-------+
| jkl     | 1004  | mini    | 2020-Feb  | lost   | yes   |
+---------+-------+---------+-----------+--------+-------+
| mno     | 1005  | mini    | 2020-Feb  | won    | yes   |
+---------+-------+---------+-----------+--------+-------+
| pqr     | 1006  | mini    | 2020-Mar  | active | no    |
+---------+-------+---------+-----------+--------+-------+
| stu     | 1007  | mini    | 2020-Mar  | won    | yes   |
+---------+-------+---------+-----------+--------+-------+
| vwx     | 1008  | joe     | 2020-Jan  | won    | no    |
+---------+-------+---------+-----------+--------+-------+
| yza     | 1009  | joe     | 2020-Mar  | lost   | yes   |
+---------+-------+---------+-----------+--------+-------+

输出

1. NO OF ISSUES:
+--------------+----------+----------+----------+
| NO OF ISSUES | 2020-Jan | 2020-Feb | 2020-Mar |
+--------------+----------+----------+----------+
| alex         |        2 |          |          |
+--------------+----------+----------+----------+
| mini         |          |        1 |        1 |
+--------------+----------+----------+----------+
| TOTAL        |        2 |        1 |        1 |
+--------------+----------+----------+----------+

FORMULA:

=TRANSPOSE(QUERY($A$2:$F,"select D,count(B) WHERE D IS NOT NULL AND E!='lost' AND F = 'yes' Group by D PIVOT C LABEL D 'NO OF ISSUES'",0))

...

2. TOTAL OPPORTUNITIES:
+---------------------+----------+----------+----------+
| TOTAL OPPORTUNITIES | 2020-Jan | 2020-Feb | 2020-Mar |
+---------------------+----------+----------+----------+
| alex                |        2 |        1 |          |
+---------------------+----------+----------+----------+
| joe                 |        1 |          |          |
+---------------------+----------+----------+----------+
| mini                |          |        1 |        2 |
+---------------------+----------+----------+----------+
| TOTAL               |        3 |        2 |        2 |
+---------------------+----------+----------+----------+

FORMULA:

=TRANSPOSE(QUERY($A$2:$F,count(B) WHERE D IS NOT NULL AND E!='lost' Group by D PIVOT C LABEL D 'TOTAL OPPORTUNITIES'",0))

...

3. FTR%:
+--------------+----------+----------+----------+
| FTR%         | 2020-Jan | 2020-Feb | 2020-Mar |
+--------------+----------+----------+----------+
| alex         |          |  100.00% |          |
+--------------+----------+----------+----------+
| joe          |  100.00% |          |          |
+--------------+----------+----------+----------+
| mini         |          |          |   50.00% |
+--------------+----------+----------+----------+
| AVERAGE FTR% |  100.00% |  100.00% |   50.00% |
+--------------+----------+----------+----------+

FORMULA:

NEED QUERY FORMULA TO CALculaTE FTR AND GENERATE THIS TABLE.

因此,一旦确定了第三张表的公式,我计划将所有3张表合并为一个查询公式:

={

{TRANSPOSE(QUERY($A$2:$F,"select COUNT(B) WHERE D IS NOT NULL AND E!='lost' AND F = 'yes' Group by D LABEL COUNT(B) 'FTR CALC' FORMAT COUNT(B) ' '",0))};
{TRANSPOSE(QUERY($A$2:$F,COUNT(B) WHERE D IS NOT NULL AND E!='lost' AND F = 'yes' Group by D PIVOT C LABEL D 'NO OF ISSUES'","select COUNT(B) WHERE D IS NOT NULL AND E!='lost' AND F = 'yes' Group by D LABEL COUNT(B) 'TOTAL'",0))};

{TRANSPOSE(QUERY($A$2:$F,"select COUNT(B) WHERE D IS NOT NULL AND E!='lost' Group by D LABEL COUNT(B) ' ' FORMAT COUNT(B) ' '",COUNT(B) WHERE D IS NOT NULL AND E!='lost' Group by D PIVOT C LABEL D 'TOTAL OPPORTUNITIES'","select COUNT(B) WHERE D IS NOT NULL AND E!='lost' Group by D LABEL COUNT(B) 'TOTAL'",0))}

}

第三张表的每个单元格中的公式将为:

=IFERROR(IF(100%-(I2/I7)*100%=0,"",100%-(I2/I7)*100%),"")

或者简单地

=100%-(I2/I7)*100%   'above 2 crosstabs starting from column H

有人可以帮我生成第三张表吗?

解决方法

好吧,我觉得有些困惑,但是如果我理解正确的话,那么我的答案可能会满足您的要求。我不清楚您是要立即完成所有操作,还是要让中间的塔巴勒结果出现在工作表中-您引用了表1,表2和表3。对于第三个表,我有一个公式,但是它基于两个中间表。可能可以合并公式以消除中间表。

在样本表中的H9中考虑以下公式:

={
  {"FTR%",TRANSPOSE(SORT(UNIQUE(FILTER(D3:D,D3:D<>""))))}; 
  {                 SORT(UNIQUE(FILTER(C3:C,C3:C<>""))),ARRAYFORMULA(IFERROR(IF((N3:P5/I3:K5)=0,"",N3:P5/I3:K5),""))}
 }

第一个转置/排序将月份的顶部移到第二个月,第二个排序将所有代理的名称放入第一列,arrayformula用两个中间表中的机会数除以决议数,以填充在FTR值中。

请注意,我已经限制了中间表的范围,但这仅仅是因为在其下方包括了用于显示目的的元素。可以像输入数据表一样,使这些范围不受限制。

如果这不正确,请告诉我们您还需要什么。

在这里查看我的样本表。 https://docs.google.com/spreadsheets/d/16otcDfnmWMEL0YpgH3aH0vn4Gip6XEY7yPDLQ9Y-83A/edit?usp=sharing

enter image description here

,

一个Apps脚本解决方案

由于您已经对这些功能有了一个答案,我相信它将使您获得所需的结果,因此,我想为您的问题提供替代的解决方案。 (对我而言)使用Apps Script不仅容易得多,而且似乎更适合这些类型的工作。

尽管我知道有很多人喜欢用公式做一切,但它们却能为您提供力量。

我基于@ kirkg13答案中给出的示例电子表格示例,因为它比问题中的查找容易得多

首先,如果您不知道如何创建Apps脚本项目,请follow this tutorial

然后将数据填写在这样的一张纸上:

enter image description here

工作表名称为“ InputData”。尽管数据量取决于您,但列数必须相同。

创建另一个名为“报告”的工作表,并将其留空。

将此代码复制到脚本编辑器中:

function main() {
  var dataRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("InputData").getDataRange()
  
  var data = dataRange.getValues()
  var headers = data.shift()
  
  var dateRange = getDateRange(data)
  var agentData = buildAgentData(data)
  
  var reportData = buildReport(dateRange,agentData,headers)
  
  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Report").getRange(1,1,reportData.length,reportData[0].length).setValues(reportData)
}

function getDateRange(data) {
  
  var dates = data.map( (record) => {return record[3]} )
  var minDate = new Date(Math.min.apply(null,dates))
  var maxDate = new Date(Math.max.apply(null,dates))
  
  var counter = minDate
  var dateRange = []
  while (counter <= maxDate) {
    dateRange.push(new Date(counter))
    counter.setDate(counter.getDate() + 1);
  }
  return dateRange
}

function buildAgentData(data) {
  
  agentData = {}
  
  data.forEach( (record) => {
    var name = record[2]
    var date = record[3]
    var resolved = record[6]
   
    if (!(name in agentData)) {
      agentData[name] = {[date]:{"cases":1,"resolved":resolved}}
    } else if (date in agentData[name]) {
      agentData[name][date]["cases"] += 1
      if (resolved == 1) {
        agentData[name][date]["resolved"] += 1
      }
    } else {
      agentData[name][date] = {"cases":1,"resolved":resolved}
    }
  })
  
  return agentData
}

function buildReport(dateRange,headers) {
  
  // BUILDING DATA ROWS
  
  var opportunities = [];
  var resolutions = [];
  var ftr = [];
    
  for(agent in agentData) {
    
    var rowOpp = [agent];
    var rowRes = [agent];
    var rowFtr = [agent];
    
    dateRange.forEach( (date) => {
    
      try {rowOpp.push(agentData[agent][date]["cases"])}
        catch(e){rowOpp.push("0")};
      try {rowRes.push(agentData[agent][date]["resolved"])}
        catch(e){rowRes.push("0")};
      try {rowFtr.push(agentData[agent][date]["resolved"] / agentData[agent][date]["cases"])}
        catch(e){rowFtr.push("0")};
    
    });
    
    opportunities.push(rowOpp);
    resolutions.push(rowRes);
    ftr.push(rowFtr);
  }
  
  
  // BUILDING HEADERS
  
  var headerOpp = ["Opportunities"]
  var headerRes = ["Resolutions"]
  var headerFtr = ["FTR"]
  
  dateRange.forEach( (date) => {
                    headerOpp.push("");
                    headerRes.push("");
                    headerFtr.push("");
                    });
  
  dateRange.unshift("");
  
  // BUILDING FINAL REPORT
  
  var report = [dateRange,headerOpp]
  opportunities.forEach((row) => {report.push(row)})
  report.push(headerRes)
  resolutions.forEach((row) => {report.push(row)})
  report.push(headerFtr)
  ftr.forEach((row) => {report.push(row)})
  
  return report
}

这将使用这些动态表填充“报告”标签。

这只是一个框架,供您用作学习工具或适应您的特定需求。

Apps脚本的参考资料