我们在使用PivotGridControl进行数据统计的时候,用时候需要在不同的行使用不同的汇总公式的情况,本文就是为了说明怎么实现此功能,如下图说明

数据源:

注意:此时数据列指定的SummaryType设置的是Sum;并且数据列指定了为double类型

SummaryType指定的几种聚合函数,Max、Min、Count适用于所有类型,只有数字类型可以适配所有聚合函数

以上示例很明显的错误:在GrandTotal列,成功数和总数直接使用求和的公式没有问题,但是成功率也使用求和的公式就出现了问题。

根据这样的场景在成功率这一行,必须使用的是总成功数/总总数的公式。这就需要在指定的行实现自定义的公式。

那么怎么实现这样的功能呢?

  1. 将数据字段的SummaryType设置为Custom

2.创建CustomSummary事件(这个事件是在创建每一个单元格的时候会调用的事件,此时可以直接修改计算的公式和显示的值)

3.实现CustomSummary事件

为了减少逻辑复杂度,此处设置数据类型、数据、日期三个字段不可拖动;班次可以拖动,但是只能作为FilterArea或者RowArea

在这样的情况下,原始数据可以不用计算成功率,改为在CustomSummary事件中计算

CustomSummary实现代码如下所示

private void pivotGridControl1_CustomSummary(object sender, DevExpress.XtraPivotGrid.PivotGridCustomSummaryEventArgs e)

{

if (e.DataField != pivotGridField2)

{

//因为需要计算的是数据字段,所以如果此时的DataField不是数据字段时,则直接返回,不执行任何操作

return;

}

//只有行数据为成功率%的时候,需要计算自定义显示的数据

if (e.RowField != null && e.RowFieldValue.ToString() == "成功率%")

{

//如果当前列字段不为空,则表示当前时Grand Total列

//也可以按照下面的写法,代表如果时日期列的时候

//if(e.ColumnFieldValue.ToString()=="日期")

if (e.ColumnField != null)

{

//此时也需要分为两种情况,一种时班次在FilterArea的时候,另外一种是班次在RowArea的时候

//因为当在RowArea的时候,每一行数据只对应唯一的一种班次,但是在FilterArea的时候还需要能够计算同时选中白班和夜班的情况

if (pivotGridField4.Area == PivotArea.FilterArea)

{

PivotDrillDownDataSource pds = e.CreateDrillDownDataSource();//获取当前单元格所关联的数据

//此处的实现有更加规范统一的方法,此处仅作为示例,所以简化了逻辑,并使用了更为固定的实现方式,不够灵活

string[] sV = pivotGridField4.GetAvailableValues().Select(t => t.ToString()).ToArray();//获取到选中的班次

string cd = pds.GetValue(0, "日期").ToString();//获取当前行的日期数据

//因为每一个分组的数据即可能变更Area,同时还可能展开和合并,此时pds就会有多行数据,这里的代码为了简化,只作为一个示例程序,因此没有

//写出这些逻辑,如果有兴趣可以自己去实现相关功能

        //注意此处用的datas数据类型为List,主要为了简化代码,直接使用Linq,因为PivotGridControl的DataSource属性只支持DataSet和DataTable这种类型

double okNum = datas.Where(t => sV.Any(v => v == t.班次) && t.数据类型 == "成功数" && t.日期 == cd).Select(t => t.数据).Sum();

double toNum = datas.Where(t => sV.Any(v => v == t.班次) && t.数据类型 == "总数" && t.日期 == cd).Select(t => t.数据).Sum();

e.CustomValue = Math.Round(okNum / toNum * 100, 2);

}

else

{

PivotDrillDownDataSource pds = e.CreateDrillDownDataSource();

string ct = pds.GetValue(0, "班次").ToString();

string cd = pds.GetValue(0, "日期").ToString();

double okNum = datas.Where(t => t.班次 == ct && t.数据类型 == "成功数" && t.日期 == cd).Select(t => t.数据).Sum();

double toNum = datas.Where(t => t.班次 == ct && t.数据类型 == "总数" && t.日期 == cd).Select(t => t.数据).Sum();

e.CustomValue = Math.Round(okNum / toNum * 100, 2);

}

}

else

{

if (pivotGridField4.Area == PivotArea.FilterArea)

{

PivotDrillDownDataSource pds = e.CreateDrillDownDataSource();

string[] sV = (string[])pivotGridField4.GetAvailableValues().Select(t => t.ToString()).ToArray();

//如果是统计列,则不需要指定具体日期,而是需要统计出所有日期的数据

double okNum = datas.Where(t => sV.Any(v => v == t.班次) && t.数据类型 == "成功数").Select(t => t.数据).Sum();

double toNum = datas.Where(t => sV.Any(v => v == t.班次) && t.数据类型 == "总数").Select(t => t.数据).Sum();

e.CustomValue = Math.Round(okNum / toNum * 100, 2);

}

else

{

PivotDrillDownDataSource pds = e.CreateDrillDownDataSource();

string ct = pds.GetValue(0, "班次").ToString();

double okNum = datas.Where(t => t.班次 == ct && t.数据类型 == "成功数").Select(t => t.数据).Sum();

double toNum = datas.Where(t => t.班次 == ct && t.数据类型 == "总数").Select(t => t.数据).Sum();

e.CustomValue = Math.Round(okNum / toNum * 100, 2);

}

}

}

else

{

e.CustomValue = e.SummaryValue.Summary;//其他的字段则使用求和公式即可

}

}

结果如下:

班次在RowArea的时候

班次倍拖动到FilterArea的时候

PivotGridControl自定义行数据的统计公式的更多相关文章

  1. 实现HBase增量入库(HBase删除自定义时间戳行数据)

    目录 1. 背景描述 2. 问题描述 3. 解决方案 1. 背景描述 目前在做音乐推荐项目,前期做排序模型优化,任务是使用模型对用户的历史音乐进行排序,有6800多万个用户,约40G的用户数据,使用H ...

  2. excel 宏循环行数据 ,Excel统计所有sheet数据行数 VBA

    Sub fun1() '统计每一个sheet有多少行数据 Set s1 = Sheets("Sheet1") 'totalok = 0 To Sheets.Count s1.Cel ...

  3. 统计mysql库中每张表的行数据

    修改数据库配置文件:vim /etc/my.cnf [client] user=username password=password 使用shell脚本统计表中的行数据:count.sh #!/bin ...

  4. 个人永久性免费-Excel催化剂功能第100波-透视多行数据为多列数据结构

    在数据处理过程中,大量的非预期格式结构需要作转换,有大家熟知的多维转一维(准确来说应该是交叉表结构的数据转二维表标准数据表结构),也同样有一些需要透视操作的数据源,此篇同样提供更便捷的方法实现此类数据 ...

  5. Excel删除重复数据及用公式筛选重复项并标记颜色突出显示

    当表格记录比较多时,常常会有重复数据,而重复记录往往只希望保存一条,因此需要把多余的删除:在 Excel 中,删除重复数据有两种方法,一种是用"删除重复数据"删除,另一种是用&qu ...

  6. Mysql 列转行统计查询 、行转列统计查询

      -- ---------------------------- -- Table structure for `TabName` -- ---------------------------- D ...

  7. hive中同列多行数据组合的方法以及array to string要点(行转列)

    1. 同列多行数据组合成一个字段cell的方法, top N 问题的hive方案 如下: hive 列转行 to json与to array list set等复杂结构,hive topN的提取的窗口 ...

  8. 作业:WordCount--实现字符数,单词数,行数的统计

    1. Gitee 地址 https://gitee.com/fyxiaobai/wordcount 2. PSP表格 PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning ...

  9. 一个将当前目录下HEX文件的第一行数据删除的程序

    为什么要写这样一个函数 在使用SoftConsole开发M3程序时,生成的hex文件,必须要把第一行数据删除,才能在Libero中使用,所以写了这个小工具,这是2.0版本了,第一版是直接删除第一行数据 ...

  10. Expression构建DataTable to Entity 映射委托 sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。 sql server 多行数据合并成一列 C# 字符串大写转小写,小写转大写,数字保留,其他除外 从0开始用U盘制作启动盘装Windows10系统(联想R720笔记本)并永久激活方法 纯CSS打造淘宝导航菜单栏 C# Winform

    Expression构建DataTable to Entity 映射委托   1 namespace Echofool.Utility.Common { 2 using System; 3 using ...

随机推荐

  1. 文心一言 VS 讯飞星火 VS chatgpt (26)-- 算法导论5.1 1题

    一.证明:假设在过程 HIRE-ASSISTANT 的第 4 行中,我们总能决定哪一个应聘者最佳.则意味着我们知道应聘者排名的全部次序. 文心一言: 证明: 假设在过程 HIRE-ASSISTANT ...

  2. CKS 考试题整理 (05)-Container 安全上下文

    Context Container Security Context 应在特定 namespace 中修改 Deployment. Task 按照如下要求修改 sec-ns 命名空间里的 Deploy ...

  3. Cause: org.apache.ibatis.builder.BuilderException: Ambiguous collection type for property 'emps'. You must specify 'javaType' or 'resultMap'

    错误原因 这个错误通常表示在解析 Mybatis 映射文件(Mapper XML)时出现了问题,可能的原因有两个: 集合属性缺少 javaType 或 resultMap 属性:该错误信息显示了 &q ...

  4. 怎么让英文大预言模型支持中文?(一)构建自己的tokenization

    代码地址:https://github.com/taishan1994/sentencepiece_chinese_bpe Part1前言 目前,大语言模型呈爆发式的增长,其中,基于llama家族的模 ...

  5. ABP - 缓存模块(2)

    1. 缓存模块源码解析 个人觉得 ABP 分布式缓存模块有三个值得关注的核心点.首先是 AbpRedisCache 类继承了微软原生的 RedisCache,并 通过反射的方式获取RedisCache ...

  6. JavaCV的摄像头实战之十二:性别检测

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<JavaCV的摄像头实战> ...

  7. docker 安装redis 6.0.8哨兵集群(一主两从三哨兵)

    准备三台主机并且安装了docker 192.168.31.132 192.168.31.134 192.168.31.144 linux 版redis6.0.8 下载 下载地址:https://dow ...

  8. SQL Server 数据库字符串分割函数

    SQL Server 数据库字符串分割函数,源代码如下: ALTER FUNCTION [dbo].[f_split] ( @SourceStr VARCHAR(MAX), -- 源字符串 @Spli ...

  9. Hugging News #0717: 开源大模型榜单更新、音频 Transformers 课程完成发布!

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  10. vulnhub_me and my grilfriend

    解题步骤 主机nmap扫描,开放22和80端口 访问该ip,发现只能本地访问 查看源代码,提示需要使用x-forwarded-for的请求头,可以在burp suite中每次添加一个请求头,也可以使用 ...