KQL动态状态码场景下:如何生成成功/失败状态计数列?
问题描述
我有一个包含Service、StatusCode、Count三列的结果集:
Service StatusCode Count A 201 100 A 202 50 A 503 20 C 201 25
其中StatusCode为动态值,数量不固定。我需要将数据转换为每行对应一个Service,各StatusCode作为列,同时新增SuccessStatusCount(统计StatusCode≥200且<500的Count总和)和FailStatusCount列,期望输出如下:
Service 201 202 503 SuccessStatusCount FailStatusCount A 100 50 20 150//(100+50) 20 C 25 0 0 25 0
目前我已通过以下pivot语句实现前几列:
let x = datatable (Service:string, ResponseCode: long, Count: long) [ "A",201,100, "A",202,50, "A",503,20, "C",201,25 ]; x | evaluate pivot(ResponseCode, sum(Count))
但由于StatusCode动态且数量较多,无法通过硬编码| extend SuccessStatusCount = 201+202+203+....的方式求和,请问如何实现这两个计数列?
解决方法
核心思路是在执行pivot之前先计算好每个服务的成功、失败计数,再将结果与pivot后的表关联,避免依赖动态生成的状态码列进行硬编码求和。
完整实现代码
let x = datatable (Service:string, ResponseCode: long, Count: long) [ "A",201,100, "A",202,50, "A",503,20, "C",201,25 ]; // 按Service分组计算成功、失败计数 let status_summary = x | summarize SuccessStatusCount = sumif(Count, ResponseCode >= 200 and ResponseCode < 500), FailStatusCount = sumif(Count, ResponseCode >= 500) by Service; // 执行pivot并关联汇总表 x | evaluate pivot(ResponseCode, sum(Count)) | join kind=inner status_summary on Service // 可选:调整列顺序,将计数列放在状态码列之后 | project-reorder Service, *, SuccessStatusCount, FailStatusCount
代码说明
- 计算汇总计数:使用
sumif函数,根据状态码的范围条件分别累加成功和失败的Count值,按Service分组后得到每个服务的汇总结果。 - 关联pivot结果:将pivot生成的动态状态码列与汇总表通过Service字段关联,确保每个服务行都带上对应的成功/失败计数。
- 列顺序调整:通过
project-reorder可以自定义列的展示顺序,把SuccessStatusCount和FailStatusCount移到状态码列之后,更贴合预期输出格式。
内容的提问来源于stack exchange,提问作者Jerald Baker
相关产品推荐
相关产品推荐

