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

数据源:

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


SummaryType指定的几种聚合函数,Max、Min、Count适用于所有类型,只有数字类型可以适配所有聚合函数
以上示例很明显的错误:在GrandTotal列,成功数和总数直接使用求和的公式没有问题,但是成功率也使用求和的公式就出现了问题。
根据这样的场景在成功率这一行,必须使用的是总成功数/总总数的公式。这就需要在指定的行实现自定义的公式。
那么怎么实现这样的功能呢?
- 将数据字段的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自定义行数据的统计公式的更多相关文章
- 实现HBase增量入库(HBase删除自定义时间戳行数据)
目录 1. 背景描述 2. 问题描述 3. 解决方案 1. 背景描述 目前在做音乐推荐项目,前期做排序模型优化,任务是使用模型对用户的历史音乐进行排序,有6800多万个用户,约40G的用户数据,使用H ...
- excel 宏循环行数据 ,Excel统计所有sheet数据行数 VBA
Sub fun1() '统计每一个sheet有多少行数据 Set s1 = Sheets("Sheet1") 'totalok = 0 To Sheets.Count s1.Cel ...
- 统计mysql库中每张表的行数据
修改数据库配置文件:vim /etc/my.cnf [client] user=username password=password 使用shell脚本统计表中的行数据:count.sh #!/bin ...
- 个人永久性免费-Excel催化剂功能第100波-透视多行数据为多列数据结构
在数据处理过程中,大量的非预期格式结构需要作转换,有大家熟知的多维转一维(准确来说应该是交叉表结构的数据转二维表标准数据表结构),也同样有一些需要透视操作的数据源,此篇同样提供更便捷的方法实现此类数据 ...
- Excel删除重复数据及用公式筛选重复项并标记颜色突出显示
当表格记录比较多时,常常会有重复数据,而重复记录往往只希望保存一条,因此需要把多余的删除:在 Excel 中,删除重复数据有两种方法,一种是用"删除重复数据"删除,另一种是用&qu ...
- Mysql 列转行统计查询 、行转列统计查询
-- ---------------------------- -- Table structure for `TabName` -- ---------------------------- D ...
- hive中同列多行数据组合的方法以及array to string要点(行转列)
1. 同列多行数据组合成一个字段cell的方法, top N 问题的hive方案 如下: hive 列转行 to json与to array list set等复杂结构,hive topN的提取的窗口 ...
- 作业:WordCount--实现字符数,单词数,行数的统计
1. Gitee 地址 https://gitee.com/fyxiaobai/wordcount 2. PSP表格 PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning ...
- 一个将当前目录下HEX文件的第一行数据删除的程序
为什么要写这样一个函数 在使用SoftConsole开发M3程序时,生成的hex文件,必须要把第一行数据删除,才能在Libero中使用,所以写了这个小工具,这是2.0版本了,第一版是直接删除第一行数据 ...
- 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 ...
随机推荐
- Rust的类型系统
Rust的类型系统 类型于20世纪50年代被FORTRAN语言引入,其相关的理论和应用已经发展得非常成熟.现在,类型系统已经成为了各大编程语言的核心基础. 通用基础 所谓类型,就是对表示信息的值进行的 ...
- 1. 认识IntelliJ IDEA
恐惧是本能,行动是信仰(在此感谢尚硅谷宋红康老师的教程) 1. Why IDEA ? [注]JetBrains 官方说明: 尽管我们采取了多种措施确保受访者的代表性,但结果可能会略微偏向 JetBra ...
- Nginx+php关联
nginx配置php选项,解除对IIS.Apache的php环境依赖 php.ini配置 取消extension_dir注释 取消cgi.fix_pathinfo注释 nginx.conf配置 取消 ...
- asp.net core如何获取客户端IP地址
客户端直接访问服务器 直接通过HttpContext.Connection.RemoteIpAddress获取客户端Ip [HttpGet] [Route("GetClientIP" ...
- 选择排序与冒泡排序(c语言+Java语言)
选择排序 O(n2) 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置. 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾. 重复第二步,直到所有元素均排序完毕. 例 ...
- 图像处理_Retinex图像增强
单尺度SSR (Single Scale Retinex) 图像 S ( x , y ) S(x,y) S(x,y)分解为两个不同的图像:反射图像 R ( x , y ) R(x,y) R(x,y), ...
- Python数据分析易错知识点归纳(六):机器学习
六.机器学习 分类和聚类的区别 分类是有监督学习,聚类是无监督学习 分类算法用于预测新样本,聚类用于理解已知数据 标准化/归一化 type_se_num = type_se[type_se!= 'ob ...
- 在windows平台使用Visual Studio 2017编译动态库并使用
使用VS stdio制作顺序表的库文件 .lib与.dll 区别 lib是编译时需要的 dll是运行时需要的 1.新建头文件和源文件 SeqList.h // SeqList.h #ifndef SE ...
- 2021-6-16 TcpIp
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Blazor前后端框架Known-V1.2.8
V1.2.8 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Gith ...