度量計算公式 案例合集¶
| 版本 | 商業版 | 企業版 | 旗艦版 | 行業專版 |
|---|---|---|---|---|
| 是否可用:自定義計算欄位 | ❌ | ✅ | ✅ | ✅ |
維度這裡可變化,本文件僅作為示例參考。 如還不瞭解度量使用,可先閱讀[ ]。 如何新增計算欄位請參考[ ],具體度量函式了解可點選[ ]。
基礎計算¶
需求/缺陷數量¶
| 場景 | 公式示例 |
|---|---|
| 需求整體情況: 計算全部需求數量 |
具體配置: 維度:優先順序 指標: COUNT(${工作項id})公式解析: 工作項 id為需求的唯一標識 因此推薦使用工作項ID計算需求數量,並按不同優先順序進行分佈 |
| 剩餘需求情況: 計算未完成的需求數量 |
具體配置: 維度:優先順序 指標: COUNTIF(${工作項id},ISNULL(${完成日期})==true)公式解析: isNull():判斷一個欄位是否為空,空返回 true,非空返回 false 工作項 id為需求的唯一標識 使用isNull()函式判斷完成日期是否為空 完成日期為空代表需求未完成,則對其進行計數,並按不同優先順序進行分佈 |
| 完成需求情況: 計算已完成的需求數量 |
具體配置: 維度:優先順序 指標: COUNTIF(${工作項id},ISNULL(${完成日期})==false)公式解析: isNull():判斷一個欄位是否為空,空返回 true,非空返回 false 工作項 id為需求的唯一標識 使用isNull()函式判斷完成日期是否為空 完成日期不為空代表需求已完成,則對其進行計數,並按不同優先順序進行分佈 |
| 參與測試的需求情況: 計算含有測試節點的需求數量 |
具體配置: 維度:優先順序 指標: countDistinctIf(${工作項id},${流程節點}.${節點名稱}=="測試")公式解析: countDistinctIf():去重計數(帶條件的) 工作項 id為需求的唯一標識 使用countDistinctIf()函式,去重計數含有測試節點的需求數量,並按不同優先順序進行分佈 |
| 高優需求完成情況: 計算優先順序為 P0 的已完成需求數量 |
具體配置: 維度:業務線 指標: countDistinctIf(${工作項id},ISNULL(${完成日期})==false&&${優先順序}==緊急需求)公式解析: countDistinctIf():去重計數(帶條件的) 工作項 id為需求的唯一標識 使用countDistinctIf()函式,去重計數含有測試節點的需求數量 按照 P0優先順序進行分佈 |
| 月需求吞吐情況: 月建立的需求 月交付完成的需求 |
具體配置: 維度: timeseries(date("2022-01-01"), date("2023-08-03"), "month")指標: countIf(${工作項id},toStartOfMonth(${完成日期})== toStartOfMonth(timelineCursor()))countIf(${工作項id},toStartOfMonth(${提出時間})== toStartOfMonth(timelineCursor()))公式解析: timelineCursor():取維度 timeseries 的切片時間 toStartOfMonth():取日期所在月的第一天 即本指標含義為,如果需求的完成日期所在月的第一天==維度timelineCursor() 所對應切片時間的所在月第一天,即把需求在該維度上計數,計算出本月完成的需求數量,同理計算本月提出的需求數量 |
| 需求周開發情況: 計算本週完成開發節點的需求數量 |
具體配置: 維度: timeseries(date("2022-01-01"), now(), "week")指標: countIf(${工作項id}, toStartofday(maxIf(${流程節點}.${節點末次結束時間},${流程節點}.${節點名稱}=="開發"))<=toStartofday(timelineCursor())&&toStartofday(maxIf(${流程節點}.${節點末次結束時間},${流程節點}.${節點名稱}=="開發"))>dateAdd(timelineCursor(),-7))公式解析: timelineCursor():取維度 timeseries 的切片時間 toStartofday():獲取當前天的起始時間,向前取整到今天開始 即本指標含義為,如果需求的完成時間,向前取整到今天開始==維度 timelineCursor所對應切片時間,每7天分割一次,即把需求在該維度上計數,計算出本週完成開發節點的需求數量,同理計算本月完成開發節點的需求數量後,用本月完成開發節點數量除以提出需求數量 |
| 定容率: 計算每月,進入前端估分的需求數量/需求評審結束的數量 |
具體配置: 維度: timeseries(date("2022-01-01"), today(), "month")指標: countIf(${工作項id}, toStartofmonth(minIf(${流程節點}.${節點末次開始時間},match(${流程節點}.${節點名稱},"估分")))==toStartofmonth(timelineCursor())))/(countIf(${工作項id}, toStartofmonth(maxIf(${流程節點}.${節點末次結束時間},${流程節點}.${節點名稱}=="需求評審"))==toStartofmonth(timelineCursor()))公式解析: timelineCursor():取維度 timeseries 的切片時間 toStartOfMonth():取日期所在月的第一天 即本指標含義為,估分節點的開始時間在當月的需求數量除以需求評審節點的末次結束時間在當月的需求數量 |
| 人均完成需求量: 計算不同業務線人均完成需求數量 |
具體配置: 維度:業務線 指標: countDistinct(${工作項id})/countDistinct(${流程節點}.${節點人員}.${負責人})公式解析: countDistinct ():用於對欄位進行去重計數 工作項 id為需求的唯一標識,判斷,按照業務線進行分佈 即本指標含義為,使用countDistinct ()函式對工作項id和節點負責人進行去重計數,然後計算人均需求完成量 |
| Bug RESOLVED情況: 計算每天新增的RESOLVED狀態缺陷數量 |
具體配置: 維度: TIMESERIES(DATE("2022-01-01"), NOW(), "day")指標: COUNTIF(${工作項id},TOSTARTOFDAY(MAXIF(${所有狀態}.${狀態首次開始時間},${所有狀態}.${狀態名稱}=="RESOLVED"))==TOSTARTOFDAY(TIMELINECURSOR()))公式解析: timelineCursor():取當前 timeseries 時間切片日期 toStartofday():獲取當前天的起始時間,向前取整到今天開始 即本指標含義為,如果缺陷例項 RESOLVED狀態的狀態首次開始時間==timeseries時間軸上的當前天就統計缺陷數量,即把缺陷在該維度上計數,計算出每天新增的RESOLVED狀態缺陷數量 |
子任務數量¶
| 場景 | 公式 |
|---|---|
| 子任務交付情況: 計算月完成的子任務數量 |
具體配置: 維度: timeseries(date("2022-01-01"), date("2023-08-03"), "month")指標: countIf(${流程節點}.${節點子任務}.${任務 id},toStartOfMonth( timelineCursor())==toStartOfMonth(filter(${流程節點}.${節點子任務}.${任務所有狀態},each.${狀態名稱}=="已完成").${狀態末次開始時間}))公式解析: timelineCursor():取維度 timeseries 的切片時間 toStartOfMonth():取日期所在月的第一天 即本指標含義為,使用toStartOfMonth函式,獲取已完成子任務的狀態末次開始時間所在月的第一天==timeseries時間軸上的切片時間,即把子任務在該維度上計數,計算出本月子任務完成數量 |
節點/狀態進入次數¶
| 場景 | 公式 |
|---|---|
| 需求評審次數: 計算需求進入評審節點的次數 |
具體配置: 資料來源:需求 維度:優先順序 指標: sumIf(${流程節點}.${節點進入次數},${流程節點}.${節點名稱}=="評審")公式解析:透過sumif()函式,對需求進入評審節點的次數求和,並按不同優先順序進行分佈 |
| 缺陷REOPENED情況: 計算缺陷進入REOPENED狀態的次數 |
具體配置: 資料來源:缺陷 維度:名稱 指標: sumIf(${所有狀態}.${狀態進入次數},${所有狀態}.${狀態名稱}=="REOPENED")公式解析:透過sumif()函式,對缺陷進入REOPENED狀態的次數求和,並按不同缺陷名稱進行分佈 |
人力盤點¶
節點估分¶
| 場景 | 公式 |
|---|---|
| 各節點估分投入分佈: 計算不同節點的估分 |
具體配置: 維度:流程節點.節點名稱 可複製指標: sum(${流程節點}.${節點估分})公式解析:透過sum()函式,統計不同節點的估分和,並按不同節點名稱進行分佈 |
| 開發節點人力投入情況: 計算指定節點的估分 |
具體配置: 維度:優先順序 指標: sumIf(${流程節點}.${節點估分},${流程節點}.${節點名稱}=="開發")或 sum(filter(${流程節點},each.${節點名稱}=="開發").${節點估分})公式解析: filter():用於對源範圍條件過濾後,生成一個新的物件陣列 each.:點語法 透過sumif()函式計算開發節點的估分和,並按不同優先順序進行分佈 使用filter()函式過濾出開發節點的估分,透過sum()函式進行求和,並按不同優先順序進行分佈 |
| 開發和測試節點人力投入情況: 計算多個指定節點的估分 |
具體配置: 維度:優先順序 指標: 指標: sumIf(${流程節點}.${節點估分},${流程節點}.${節點名稱}=="開發"\|\|${流程節點}.${節點名稱}=="測試")或 sum(filter(${流程節點},each.${節點名稱}=="開發" \|\| each.${節點名稱}=="測試").${節點估分})公式解析: filter():用於對源範圍條件過濾後,生成一個新的物件陣列 each.:點語法 透過sumif()函式計算開發節點和測試節點的估分和,並按不同優先順序進行分佈 使用filter()函式過濾出開發節點和測試節點的估分,透過sum()函式進行求和,並按不同優先順序進行分佈 |
| 已完成的開發和測試節點人力投入情況: 計算多個指定節點且已完成節點的估分 |
具體配置: 維度:優先順序 指標: sumIf(${流程節點}.${節點估分},contains(["開發","測試"],${流程節點}.${節點名稱})&& ${流程節點}.${節點狀態}==$option{已完成})或 sumIf(filter(${流程節點},each.${節點名稱}=="開發" \|\| each.${節點名稱}=="測試").${節點估分},${流程節點}.${節點狀態}==$option{已完成})公式解析: filter():用於對源範圍條件過濾後,生成一個新的物件陣列 each.:點語法 contains():判斷陣列是否包含某一個元素,是返回 true,反之返回 false 使用contains()函式判斷節點名稱是否==開發或者測試,並且判斷節點狀態為已完成,透過sumif函式對指定節點估分進行求和,並按不同優先順序進行分佈 使用filter()函式過濾出開發節點和測試節點的估分,並且判斷節點狀態為已完成,透過sumif函式對指定節點估分進行求和,並按不同優先順序進行分佈 |
任務估分¶
| 場景 | 公式 |
|---|---|
| 已完成的開發任務人力投入情況: 計算開發節點下已完成的子任務估分和 |
具體配置: 指標: sumIf(${流程節點}.${節點子任務}.${任務估分},${流程節點}.${節點名稱}=="開發"&&${流程節點}.${節點子任務}.${任務狀態}==$option{已完成})公式解析: filter():用於對源範圍條件過濾後,生成一個新的物件陣列 each.:點語法 使用sumif()函式,判斷節點名稱==開發,並且節點子任務狀態==已完成,滿足條件則對其估分進行求和 |
| 開發節點子任務的人力投入情況: 開發節點下的子任務估分插值 |
具體配置: 指標: sum(filter(${流程節點},each.${節點名稱}=="開發").${節點子任務}.${任務人員}.${估分插值(子任務精度)})公式解析: filter():用於對源範圍條件過濾後,生成一個新的物件陣列 each.:點語法 使用filter()函式過濾出開發節點 {節點子任務}.{任務人員}.{估分插值(子任務精度),透過sum()函式進行求和 |
人員估分¶
| 場景 | 公式 |
|---|---|
| 檢視各節點負責人的人力投入情況: 計算節點人員的估分 |
具體配置: 維度: {流程節點}.{節點人員}指標: sum(${流程節點}.${節點人員}.${人員估分排期}.${人員估分})公式解析:使用sum()函式計算{節點人員}.{人員估分排期}.{人員估分}的估分和,並按不同節點人員進行分佈 |
| 檢視各子任務負責人的人力投入情況: 計算節點子任務人員估分 |
具體配置: 維度: {流程節點}.{節點子任務}.{任務人員}指標: sum(${流程節點}.${節點子任務}.${任務人員}.${人員估分排期}.${人員估分})公式解析:使用sum()函式計算{節點子任務}.{任務人員}.{人員估分排期}.{人員估分}估分和,並按不同任務人員進行分佈 |
| 計算每月的人力(估分)投入: 計算估分分佈在每個月上的插值,當人力估分資料涉及到時間週期的統計,需要使用估分插值 |
具體配置: 維度: timeseries(date("2023-01-01"),today(),"month")指標: sum(${流程節點}.${節點人員}.${估分插值})公式解析: timeseries():輸出時間軸,支援 day、workday、week、bi-week、month、bi-month、quarter 與 year 輸出,不能與其他函式混合使用 例:timeseries(startTime,endTime, "day") 使用sum()函式計算節點人員的估分插值並求和,按月維度進行分佈 |
| 計算每個月不同團隊的需求人力(估分)投入 當人力估分資料涉及到時間週期的統計,需要使用估分插值 |
具體配置: 維度: timeseries(date("2023-01-01"),today(),"month");{流程節點}.{節點人員}.{所屬團隊}指標: sum(${流程節點}.${節點人員}.${估分插值})公式解析: timeseries():輸出時間軸,支援 day、workday、week、bi-week、month、bi-month、quarter 與 year 輸出,不能與其他函式混合使用 例:timeseries(startTime,endTime, "day") 使用sum()函式計算節點人員的估分插值並求和,按所屬團隊,月維度進行分佈 |
| 計算每個月某指定團隊人員的估分 | 具體配置: 維度: timeseries(date("2023-01-01",today(),"month")指標: sum(filter(${流程節點}.${節點人員},contains(each.${所屬團隊},$team{團隊})).${估分插值})公式解析: timeseries():輸出時間軸,支援 day、workday、week、bi-week、month、bi-month、quarter 與 year 輸出,不能與其他函式混合使用 例:timeseries(startTime,endTime, "day") filter():用於對源範圍條件過濾後,生成一個新的物件陣列 Contains()判斷陣列是否包含某一個元素,是返回 true,反之返回 false 使用filter()函式,contains()函式,過濾和判斷節點人員是否屬於指定團隊,並對符合條件的人員估分插值求和,按月維度進行分佈 |
| 檢視RD在需求內的人力投入: 計算RD作為負責人的節點的估分和,維度需要使用節點角色人員 |
具體配置: 維度: filter(${流程節點}.${節點人員}.${流程角色},each.${名稱}=="RD").${角色人員}指標: sum(${流程節點}.${節點人員}.${人員估分排期}.${人員估分})公式解析: filter():用於對源範圍條件過濾後,生成一個新的物件陣列 使用filter()函式,過濾出RD角色作為節點負責人的節點 使用sum()函式對節點人員估分進行求和 |
| 檢視一段時間內,PM在需求內的人力投入: 計算一段時間內,PM作為負責人的節點的估分插值和,維度需要使用節點角色人員 |
具體配置: 維度: FILTER(${流程節點}.${節點人員}.${流程角色},each.${名稱}=="PM").${角色人員}TIMELINE(DATE("2023-01-01"),TODAY(),"day")指標: SUM(${流程節點}.${節點人員}.${估分插值})公式解析: timeline():輸出時間軸,支援 day、workday、week、bi-week、month、bi-month、quarter 與 year 輸出,不能與其他函式混合使用 例:timeline(startTime,endTime, "day") filter():用於對源範圍條件過濾後,生成一個新的物件陣列 each.:點語法 使用filter()函式配合timeline條件,過濾出PM作為負責人的節點 使用sum()函式對節點人員估分插值進行求和 |
| 統計不同bug負責人在需求上投入的人力 維度返回和關聯缺陷角色人員相等的需求節點負責人 |
具體配置: 維度: FILTER(${流程節點}.${節點人員},CONTAINS($related{缺陷-關聯需求}.${經辦人},each.${全部人員}))指標:估分插值(求和) 公式解析: 關聯工作項{缺陷-關聯需求}需透過@喚起 |
階段週期¶
節點耗時¶
| 場景 | 公式 |
|---|---|
| 不同節點的平均交付週期(天): 計算全部已完成的節點的平均耗時 |
具體配置: 維度:流程節點 指標: avgIf(${流程節點}.${節點累計進行時間},${流程節點}.${節點狀態}==$option{已完成})/86400公式解析:使用avgIf()函式,判斷節點狀態為已完成,並對節點累計進行時間求平均值,按不同流程節點進行分佈 |
| 需求整體的交付週期(天): 計算需求從提出到完成的平均耗時 |
具體配置: 維度:優先順序 指標: avg(${完成日期} - ${提出時間})/86400公式解析:使用avgIf()函式,計算需求平均交付週期(完成日期-提出時間),按不同優先順序進行分佈 |
| 需求開發耗時(天): 計算需求的開發節點從開始到完成的平均耗時 |
具體配置: 維度:需求型別 指標: avg(maxif(${流程節點}.${節點末次結束時間}, ${流程節點}.${節點名稱}=="開發")-maxif(${流程節點}.${節點末次開始時間}, ${流程節點}.${節點名稱}=="開發"))/86400公式解析:使用avg()函式,計算開發節點從開始到完成的平均時間(可使用節點末次結束時間-節點末次開始時間,求出節點累計進行時間),按不同需求型別進行分佈。 |
節點延期¶
| 場景 | 公式 |
|---|---|
| 各節點延期情況: 以節點為維度,計算不同節點的延期數量 |
具體配置: 維度:節點名稱 指標: COUNTIF(${流程節點},( ${流程節點}.${節點狀態}==$option{已完成}&&${流程節點}.${節點排期}.${週期時長}!=0&&${流程節點}.${節點末次結束時間}>${流程節點}.${節點排期}.${預計結束日期})\|\|( ${流程節點}.${節點狀態}!=$option{已完成}&&${流程節點}.${節點排期}.${週期時長}!=0&&NOW()>${流程節點}.${節點排期}.${預計結束日期}))公式解析: 流程節點.節點排期.週期時長!=0:節點存在排期 以節點為維度展示,有兩類延期情況: 如果節點已完成且存在排期,且節點結束時間大於排期結束時間,則延期 如果節點未完成且存在排期,且當前時間大於排期結束時間,則延期 滿足延期情況的任意一類,即為延期,統計延期的節點數量 |
| 進行中需求延期情況: 判斷當前正在進行中的節點是否延期 |
具體配置: 指標: countDistinctIf(${工作項id},maxIf(toStartOfDay(today())-toStartOfDay(${流程節點}.${節點排期}.${預計結束日期}),${流程節點}.${節點狀態}==$option{進行中})>0&&isNull(${流程節點}.${節點排期}.${預計結束日期})==false)公式解析: countDistinctIf():去重計數(帶條件的) toStartOfDay():獲取當前天的起始時間,向前取整到今天開始 使用toStartOfDay()函式 獲取 今天和節點排期的預計結束日期 都向前取整到今天開始 並滿足條件:節點狀態==進行中,節點排期預計結束日期不為空,並且 today()-預計結束日期>0 使用countDistinctIf()函式對滿足以上條件的節點進行計數 |
| 需求指定節點延期數量: 計算開發節點,實際完成>預計完成的需求數量; |
具體配置: 維度:優先順序 指標: countIf(${工作項id},(maxIf(toStartOfDay(${流程節點}.${節點末次結束時間}),${流程節點}.${節點名稱}=="開發"&&${流程節點}.${節點狀態}==$option{已完成})- maxIf(toStartOfDay(${流程節點}.${節點排期}.${預計結束日期}),${流程節點}.${節點名稱}=="開發"&&${流程節點}.${節點狀態}==$option{已完成}))>0)公式解析: toStartOfDay():獲取當前天的起始時間,向前取整到今天開始 使用toStartOfDay()函式 獲取【節點末次結束時間,節點排期的預計結束日期】都向前取整到今天開始,並滿足條件:節點狀態==已完成,節點末次結束時間取值開發節點,節點排期預計結束日期取值估分節點 使用節點末次結束時間-預計結束日期,如果值大於0,則開發節點延期 使用countIf()函式對延期需求進行計數,按不同優先順序進行分佈 |
| 需求指定節點延期天數: 計算開發延期的節點,實際完成時間-預計完成時間的平均值 |
具體配置: 維度:需求名稱 指標: avgIf((toStartOfDay(${流程節點}.${節點末次結束時間})-toStartOfDay(${流程節點}.${節點排期}.${預計結束日期}))/86400,${流程節點}.${節點名稱}=="開發"&&isNull(${流程節點}.${節點排期}.${預計結束日期})==false&&(toStartOfDay(${流程節點}.${節點末次結束時間})-toStartOfDay(${流程節點}.${節點排期}.${預計結束日期})>0))公式解析: toStartOfDay():獲取當前天的起始時間,向前取整到今天開始 isNull():判斷一個欄位是否為空,空返回 true,非空返回 false 使用toStartOfDay()函式 獲取【節點末次結束時間,節點排期的預計結束日期】都向前取整到今天開始 並滿足條件:節點名稱==開發,節點排期預計結束日期不為空,並且節點末次結束時間-預計結束日期>0 使用avgIf()函式對【節點末次結束時間-預計結束日期】的結果取平均值 按不同需求名稱進行分佈 |
任務延期¶
| 場景 | 公式 |
|---|---|
| 統計延期完成的子任務: 在任務工作項計算節點任務延期數量 |
具體配置: 指標: countIf(${流程節點}.${節點子任務}.${任務 id},(toStartOfDay(${完成日期})-toStartOfDay(${排期}.${結束日期})>0))公式解析: countIf():透過條件判斷來獲取欄位包含值數量 toStartOfDay():獲取當前天的起始時間,向前取整到今天開始 使用toStartOfDay()函式 獲取 任務工作項的完成日期和結束日期的時間 都向前取整到今天開始 如果任務工作項的完成日期-排期內的結束日期>0的話,則對任務id進行計數 |
| 統計延期完成的子任務: 在需求內計算節點子任務的延期數量 |
具體配置: 維度:需求名稱 指標: countIf(${流程節點}.${節點子任務}.${任務 id},(filter(${流程節點}.${節點子任務},each.${任務狀態}==$option{已完成}).${任務所有狀態}.${狀態末次結束時間}-filter(${流程節點}.${節點子任務},each.${任務狀態}==$option{已完成}).${任務排期}.${預計結束日期})>0)公式解析: countIf():透過條件判斷來獲取欄位包含值數量 filter():用於對源範圍條件過濾後,生成一個新的物件陣列 each.:點語法 使用filter()函式過濾篩選出,任務狀態==已完成,並且任務狀態末次結束時間-預計結束日期>0 如果滿足以上條件則使用countif函式對其進行計數 按不同需求名稱進行分佈 |
狀態耗時¶
| 場景 | 公式 |
|---|---|
| BUG平均解決時長: 計算缺陷從提出到歸檔的平均耗時 |
具體配置: 維度:優先順序 指標: avg(${歸檔日期} - ${提出時間})/86400公式解析:使用avg函式對(缺陷歸檔日期-提出時間)的結果取平均值,並按不同優先順序進行分佈。 |
| BUG open狀態持續時長: 計算缺陷在open狀態的累計時間 |
具體配置: 維度:優先順序 指標: sumIf(${所有狀態}.${狀態累計進行時間},${所有狀態}.${狀態名稱}=="OPEN")/86400公式解析: 使用sumif()函式,判斷缺陷狀態是否為open 符合條件則對狀態累計進行時間求和 按不同優先順序進行分佈 |
| BUG 當前狀態持續時長: 計算當前進行的狀態累計時間 |
具體配置: 維度:工作項 id 指標: SUMIF( ${所有狀態}.${狀態累計進行時間},MATCH(${所有狀態}.${狀態名稱},${狀態}))/86400公式解析: 使用 sumif()函式,計算所有狀態中,狀態名稱匹配當前狀態的狀態累計進行時間,然後除以86400,得到天數 |
| BUG從OPEN到RESOLVED的平均週期: 計算缺陷在多個狀態的累計進行時間和 |
具體配置: 指標: avg(maxIf(${所有狀態}.${狀態首次開始時間},${所有狀態}.${狀態名稱}=="RESOLVED"&&(${狀態}==$option{REOPENED}\|\|${狀態}==$option{CLOSED}))-maxIf(${所有狀態}.${狀態首次開始時間},${所有狀態}.${狀態名稱}=="OPEN"&&(${狀態}==$option{REOPENED}\|\|${狀態}==$option{CLOSED})))/86400公式解析:計算open,closed缺陷狀態的狀態首次開始時間 - reopen,reclosed缺陷狀態的狀態首次開始時間,對結果取平均值 |
跨工作項¶
度量-計算欄位內,判斷/計算關聯工作項資料,需透過@語法,喚起關聯工作項關係後選擇需要的資訊。

關聯工作項計算¶
| 場景 | 公式 |
|---|---|
| 需求關聯專案數量: 在需求計算不同需求關聯的專案數量 |
具體配置: 資料來源:需求 維度:需求名稱 指標: countIf($related{需求-專案關聯},$related{需求-專案關聯}.${需求狀態}!=$option{已終止})公式解析: 使用countif()函式 判斷需求狀態不等於已終止,滿足條件則進行計數 按不同需求名稱進行分佈 |
| 版本維度的bug估分比: 計算版本關聯的缺陷總數/版本的總估時 |
具體配置: 資料來源:版本 維度:版本名稱 指標: count($related{空間 A_缺陷-版本關聯_空間 A_缺陷})/sum(${版本估時})版本缺陷總數: count($related{空間 A_缺陷-版本關聯_空間 A_缺陷})版本總估時: sum(${版本估時})公式解析:: 使用count()函式,對版本關聯缺陷進行計數 使用sum()函式,對版本總估時進行求和 使用count()函式,計算(版本關聯缺陷總數/版本總估時),得出版本維度的bug估分比 按不同版本名稱進行分佈 |
| 需求維度的bug估分比: 計算需求關聯bug總數/需求所有研發節點的估分和 |
具體配置: 資料來源:需求 維度:需求名稱 指標: count($related{五道口nps_缺陷-關聯需求_五道口nps_缺陷})/sumIf(${流程節點}.${節點估分},${流程節點}.${節點名稱}=="開發")公式解析: 使用count()函式,計算缺陷關聯需求數量 使用sumif()函式,判斷節點名稱==開發時,計算節點估分和 計算(缺陷關聯需求數量 / 開發節點的估分和),計算出需求維度的bug估分比 按不同需求名稱進行分佈 |
| 時間維度的bug估分比: 計算本月提出且經辦的bug數/本月需求開發估分和 |
具體配置: 資料來源:需求 維度:timeline() 指標: countIf($related{五道口nps_缺陷-關聯需求_五道口nps_缺陷},toStartOfMonth($related{五道口nps_缺陷-關聯需求_五道口nps_缺陷}.${提出時間})==toStartOfMonth(timelineCursor()))/sumIf(${流程節點}.${節點人員}.${估分插值},${流程節點}.${節點人員}.${流程角色}.${名稱}=="開發")公式解析: timelineCursor():取維度 timeline 的切片時間; toStartOfMonth():取日期所在月的第一天; 使用toStartOfMonth函式,根據bug提出時間獲取並判斷日期所在月的第一天==timelineCursor切片時間,得出本月提出且經辦的bug數 使用上述值 / 需求中開發角色的估分插值和,得出bug估分比 按時間維度進行分佈 |
| 需求維度的BUG解決週期: 計算不同業務線的需求,所關聯缺陷的平均修復時間 |
具體配置: 維度: $related{五道口nps_缺陷-關聯需求_五道口nps_【需求】}.${業務線}指標: avgIf(${歸檔日期}-${提出時間},${是否完成}==true)/86400公式解析: 判斷需求是否完成 獲取需求歸檔日期-提出時間的平均值 按不同業務線的需求維度進行展示 |
| 缺陷人員在關聯需求上的估分投入 計算不同缺陷經辦人(單人),在需求上的人力投入 |
具體配置: 資料來源:需求 維度: $related{五道口nps_缺陷-關聯需求_五道口nps_【需求】}.${經辦人}指標: sumIf(${流程節點}.${節點人員}.${人員估分排期}.${人員估分},contains($related{五道口nps_缺陷-關聯需求_五道口nps_缺陷}.${經辦人},${流程節點}.${節點人員}))公式解析: 判斷缺陷經辦人==關聯需求的節點人員 滿足上述條件,則計算節點人員估分 按不同經辦人進行分佈。 |
跨工作項判斷¶
| 場景 | 公式 |
|---|---|
| 專案維度的需求、缺陷剩餘情況: 計算專案關聯的未完成的需求和bug數量和 |
具體配置: 資料來源:版本 維度:版本名稱 指標: countIf($related{五道口nps_需求-專案關聯_五道口nps_【需求】},$related{五道口nps_需求-專案關聯_五道口nps_【需求】}.${需求狀態}!=$option{已上線})+countif($related{五道口nps_缺陷-專案關聯_五道口nps_缺陷},$related{五道口nps_缺陷-專案關聯_五道口nps_缺陷}.${狀態}!=$option{CLOSED})公式解析: 判斷關聯需求的狀態不等於已上線,滿足以上條件則對需求進行計數 判斷關聯缺陷狀態不等於closed,滿足以上條件則對需求進行計數 對需求和缺陷數量進行求和 按不同版本名稱進行分佈 |
| 行業客戶需求分佈: 需求關聯客戶,計算不同行業客戶的需求數量 |
具體配置: 資料來源:客戶工作項 維度:客戶行業 指標: countIf($related{五道口nps_需求-客戶關聯_五道口nps_【需求】},$related{五道口nps_需求-客戶關聯_五道口nps_【需求】}.${客戶行業}==$option{製造業})公式解析: 判斷需求關聯客戶行業是否等於指定值進行計數 按照不同客戶行業進行分佈 |
| 專案完成度: 專案下的需求全部完成才算專案完成,計算完成專案的佔比 |
具體配置: 資料來源:專案 指標: countIf(${工作項id},countIf($related{五道口nps_需求-專案關聯_五道口nps_【需/求】}.${工作項id},isNull($related{五道口nps_需求-專案關聯_五道口nps_【需/求】}.${完成日期})==true)==0)/count(${工作項id})公式解析: 判斷專案下全部需求的完成日期不為空,滿足條件則對專案計數(完成專案) 使用完成專案/總專案求得佔比 按不同專案進行分佈。 |
跨工作項對比¶
| 場景 | 公式 |
|---|---|
| 需求跨迭代完成情況: 計算需求的完成時間,大於規劃迭代完成時間的需求數量 |
具體配置: 資料來源:迭代 指標: countIf($related{五道口nps_需求-迭代關聯_五道口nps_【需求】},$related{五道口nps_需求-迭代關聯_五道口nps_【需求】}.${完成時間}>${排期}.${結束日期})公式解析: 判斷需求關聯專案的完成時間>專案排期的結束日期,則該專案跨迭代,對其進行計數。 |
| 上線需求bug解決情況: 在需求計算,關聯的缺陷完成時間晚於需求完成時間的缺陷數量 |
具體配置: 資料來源:需求 指標: countIf($related{五道口nps_缺陷-關聯需求_五道口nps_缺陷},($related{五道口nps_缺陷-關聯需求_五道口nps_缺陷}.${歸檔日期}>${完成日期}&&isNull($related{五道口nps_缺陷-關聯需求_五道口nps_缺陷}.${歸檔日期})==true)&&isNull(${完成日期})==false)公式解析: 判斷需求關聯缺陷 歸檔日期>完成日期 並且需求關聯缺陷的歸檔日期和完成日期不為空 滿足以上條件則對其進行計數 |
進階場景¶
複合欄位¶
| 場景 | 公式 |
|---|---|
| 統計複合欄位整體非空的需求數量 複合欄位:團隊規劃迭代 |
具體配置: 資料來源:需求 指標: COUNT(${團隊規劃迭代})公式解析: 對複合欄位整體進行 COUNT,即統計複合欄位不為空的需求數量 |
| 統計複合欄位的新增組數 複合欄位:團隊規劃迭代 |
具體配置: 資料來源:需求 指標: COUNT(BYROW(${團隊規劃迭代}, each))公式解析: BYROW 按組展開複合欄位“團隊規劃迭代”,獲取複合欄位的組數 COUNT 對複合欄位的組數計數 |
| 統計複合欄位中,各團隊填寫的規劃工作量 複合欄位:團隊規劃迭代 子欄位1:團隊 子欄位2:規劃工作量 |
具體配置: 資料來源:需求 維度: BYROW(${團隊規劃迭代},each.${團隊})指標: SUM(BYROW(${團隊規劃迭代},each.${規劃工作量}))公式解析: BYROW 獲取複合欄位“團隊規劃迭代”中的子欄位“團隊”作為維度,按不同團隊統計 BYROW 獲取複合欄位“團隊規劃迭代”中的子欄位“規劃工作量”作為指標 規劃工作量為數字欄位,用 SUM 進行求和 |
| 統計複合欄位中,前端團隊的規劃工作量 複合欄位:團隊規劃迭代 子欄位1:團隊 子欄位2:規劃工作量 |
具體配置: 資料來源:需求 指標: SUM(BYROWIF(${團隊規劃迭代},each.${規劃工作量},each.${團隊}==$option{前端}))公式解析: BYROWIF 判斷條件是團隊等於前端 滿足條件時,獲取複合欄位“團隊規劃迭代”中的子欄位“規劃工作量” 規劃工作量為數字欄位,用 SUM 進行求和 |
| 統計複合欄位中,至少存在一組前端團隊參與的需求數 複合欄位:團隊規劃迭代 子欄位:團隊 |
具體配置: 資料來源:需求 指標: COUNTIF(${工作項id},IFANYOF(${團隊規劃迭代},each.${團隊}==$option{前端})==true)公式解析: IFANYOF 判斷複合欄位“團隊規劃迭代”是否至少存在一組是“前端”團隊,是,則返回 true COUNTIF 判斷存在滿足條件的複合欄位,則統計工作項ID計數 |
| 統計複合欄位中,每一組規劃工作量非空的需求數 複合欄位:團隊規劃迭代 子欄位:規劃工作量 |
具體配置: 資料來源:需求 指標: COUNTIF(${工作項id}, IFALLOF(${團隊規劃迭代}, ISNULL(each.${規劃工作量})==false)==true)公式解析: ISNULL判斷“規劃工作量”是否為空值,為空值則返回 true,否則返回 false IFALLOF 判斷複合欄位“團隊規劃迭代”是否每一組的“規劃工作量”不為空,均不為空,則返回 true COUNTIF 判斷存在滿足條件的複合欄位,則統計工作項ID計數 |
相等判斷¶
| 場景 | 公式 |
|---|---|
| 判斷角色是否和人員欄位相等 | 具體配置: 指標: countif(${工作項id},filter(${參與人員}.${流程角色},each.${名稱}=="處理人").${角色人員}!=${流程節點}.${節點人員}.${負責人})公式解析: 使用filter函式過濾參與人員 判斷條件:角色名稱為處理人,並且角色人員不等於責任人 對工作項進行計數 |
| 統計不同bug負責人在需求上投入的人力 維度返回和關聯缺陷角色人員相等的需求節點負責人 |
具體配置: 維度: FILTER(${流程節點}.${節點人員},CONTAINS($related{缺陷-關聯需求}.${經辦人},each.${全部人員}))指標:估分插值(求和) 公式解析: 關聯工作項{缺陷-關聯需求}需透過@喚起 |
| 統計不同bug負責人在需求上投入的人力 維度返回和關聯缺陷單選人員欄位相等的需求節點負責人 |
具體配置: 維度: FILTER(${流程節點}.${節點人員},each.${全部人員}==$related{缺陷-關聯需求}.${負責人})指標:估分插值(求和) 公式解析: 關聯工作項{缺陷-關聯需求}需透過@喚起 |
空值判斷¶
| 場景 | 公式 |
|---|---|
| 判斷節點負責人為空 | 具體配置: 指標: countIf(${流程節點}.${節點 ID},empty(${流程節點}.${節點人員}.${負責人})==true)公式解析: empty():判斷一個欄位是否為空,空返回 true,非空返回 false 判斷節點負責人是否為空,為空則對節點進行計數 |
角色/節點人員¶
| 場景 | 公式 |
|---|---|
| 進行中節點負責人 | 具體配置:FILTER( ${流程節點},each.${節點狀態}==$option{進行中}).${節點人員}.${負責人}公式解析:FILTER 篩選進行中節點,然後獲取對應的節點負責人。 |
| 展示某團隊的節點人員 | 具體配置: 維度: filter(${流程節點}.${節點人員},contains(each.${所屬團隊},$team{團隊名稱}))公式解析: filter():用於對源範圍條件過濾後,生成一個新的物件陣列 each.:點語法; contains():判斷陣列是否包含某一個元素,是返回 true,反之返回 false 使用filter()函式,過濾篩選節點人員是否屬於指定團隊 |
| 展示開發角色上的人員 | 具體配置: 維度: filter(${參與人員}.${流程角色},each.${名稱}=="開發").${角色人員}公式解析: filter():用於對源範圍條件過濾後,生成一個新的物件陣列 each.:點語法; 使用filter()函式,過濾篩選開發角色上的人員 |
| 展示開發節點上的節點負責人 | 具體配置: 維度: filter(${流程節點},each.${節點名稱}=="開發").${節點人員}.${負責人}公式解析: filter():用於對源範圍條件過濾後,生成一個新的物件陣列 each.:點語法; 使用filter()函式進行過濾,並找到開發節點上的負責人 |
| 計算角色人員個數 | 具體配置: 指標: countDistinctIf(${參與人員}.${流程角色}.${角色人員},${參與人員}.${流程角色}.${名稱}=="PM")公式解析: countDistinctIf():去重計數(帶條件的) 使用countDistinctIf()函式,判斷流程角色名稱是否為“PM”,滿足條件則對角色人員進行計數 |
| 計算需求內兩個角色的估分比 | 具體配置: 指標: sum(filter(${流程節點}.${節點人員}.${人員估分排期},each.${角色名稱}=="PM").${人員估分})/sum(filter(${流程節點}.${節點人員}.${人員估分排期},each.${角色名稱}=="DA").${人員估分})公式解析: filter():用於對源範圍條件過濾後,生成一個新的物件陣列 each.:點語法; 使用filter()函式過濾篩選節點人員 用PM角色的人員估分 / DA角色的人員估分,得出估分比 |
| 判斷指定人員作為某角色參與的需求數量 | 具體配置: 單人: COUNTIF(${工作項id},CONTAINS(${PM},$user{小張}))多人: COUNTIF(${工作項id},CONTAINSANY(${PM},[$user{小張},$user{麗麗}]))公式解析:CONTAINS判斷,PM角色中是否包含小張,如果包含透過countif進行計數。 |
| 判斷指定人員作為節點負責人參與的需求數量 | 具體配置: 單人: COUNTIF(${工作項id},${流程節點}.${節點人員}==$user{小張})多人: COUNTIF(${工作項id},CONTAINS([$user{小張},$user{麗麗}],${流程節點}.${節點人員}))公式解析:CONTAINS判斷,節點負責人是否是小張或者麗麗,如果是透過countif進行計數。 |
節點資訊計算¶
| 場景 | 公式 |
|---|---|
| 計算某個節點上的參與人員中屬於某個團隊的人員個數 | 具體配置: 指標: countdistinct(filter(${流程節點}.${節點人員},contains(${流程節點}.${節點人員}.${所屬團隊},$team{團隊})))公式解析: countDistinct ():用於對欄位進行去重計數 ; filter():用於對源範圍條件過濾後,生成一個新的物件陣列 contains()判斷陣列是否包含某一個元素,是返回 true,反之返回 false 使用filter()函式進行過濾節點人員 透過contains()函式判斷節點人員是否屬於某團隊,巢狀在countDistinct函式內進行去重計數 |
| 計算多個並行節點的最晚完成時間 | 具體配置: 維度: max(filter(${流程節點},each.${節點名稱}=="節點1"\|\|each.${節點名稱}=="節點2").${節點實際結束時間})公式解析: filter():用於對源範圍條件過濾後,生成一個新的物件陣列 each.:點語法 使用filter()函式進行過濾流程節點,獲取並行節點1和節點2的實際結束時間 |
| 計算指定節點已完成的子任務數量 | 具體配置: 指標: COUNT(FILTER(FILTER(${流程節點},each.${節點名稱}=="開發").${節點子任務},each.${任務狀態}==$option{已完成}))公式解析: FILTER(${流程節點},each.${節點名稱}=="開始").${節點子任務}:找到名字叫開發的節點並返回他的子任務; FILTER(FILTER(${流程節點},each.${節點名稱}=="開發").${節點子任務},each.${任務狀態}==$option{已完成}):判斷改子任務的狀態等於已完成; 透過count針對已完成的子任務計數。 |
其他¶
| 場景 | 公式 |
|---|---|
| 判斷多選欄位 | 具體配置: 指標: countif(${工作項id},contains(${標籤},$option{超時}))公式解析: contains():判斷陣列是否包含某一個元素,是返回 true,反之返回 false 使用contains函式找到標籤為超時的工作項並計數 |
| 判斷開關欄位 | 具體配置: 指標: countif(${工作項id},${需要安全合規}==true)公式解析:判斷需要安全合規開關欄位==true,符合條件則對工作項進行計數 |
| 給欄位賦值 | 具體配置: 指標: count(${優先}=="待定")公式解析:給優先欄位賦值“待定” |
| 計算當月的工作日天數 | 具體配置: 指標: workdaysBetween(toStartOfMonth(timelineCursor()),timelineCursor())公式解析: timelineCursor():取維度 timeline 的切片時間; toStartOfMonth():取日期所在月的第一天 workdaysBetween():返回兩個日期之間的工作日天數,值為 date2-date1 的結果 計算當月的工作日天數 |
| 動態計算上月資料 | 維度:timeseries 指標: 上月第一天: TOSTARTOFMONTH(DATEADD(TOSTARTOFMONTH(TIMELINECURSOR()),-1))上月最後一天: DATEADD(TOSTARTOFMONTH(TIMELINECURSOR()),-1) |