我们在使用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. Java(类的继承)

    1.继承 extends的意思是"扩展".子类是父类的扩展,使用关键字extends来表示. Java里,一个类只能继承一个父类. 继承是类与类之间的一种关系,此外还有依赖.组合. ...

  2. 聊聊Cola-StateMachine轻量级状态机的实现

    背景 在分析Seata的saga模式实现时,实在是被其复杂的 json 状态语言定义文件劝退,我是有点没想明白为啥要用这么来实现状态机:盲猜可能是基于可视化的状态机设计器来定制化流程,更方便快捷且上手 ...

  3. WPF入门教程系列二十八 ——DataGrid使用示例MVVM模式(5)

    WPF入门教程系列目录 WPF入门教程系列二--Application介绍 WPF入门教程系列三--Application介绍(续) WPF入门教程系列四--Dispatcher介绍 WPF入门教程系 ...

  4. CMU15445 (Fall 2020) 数据库系统 Project#2 - B+ Tree 详解(上篇)

    前言 考虑到 B+ 树较为复杂,CMU15-445 将 B+ 树实验拆成了两部分,这篇博客将介绍 Checkpoint#1 部分的实现过程,搭配教材 <DataBase System Conce ...

  5. NFS远程挂载

    NFS远程挂载 一.概述 NFS是一种基于TCP/IP 传输的网络文件系统协议.通过使用NFS协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源 NAS存储: NFS服务的实现依赖于RPC ...

  6. How to build a OR condition in Elasticsearch Query DSL

    How to build a OR condition in Elasticsearch Query DSL 参考 Query Example Query DSL 表达方

  7. 【tvm解析】 Operator Strategy 机制

    本文地址:https://www.cnblogs.com/wanger-sjtu/p/15082871.html Relay Operator Strategy是建立Relay IR与TOPI算子库的 ...

  8. AI与健康管理:趋势与未来

    目录 引言 随着人工智能技术的不断发展,健康管理也逐渐成为了一个新的研究领域.AI技术可以为健康管理提供智能化.个性化.高效的支持,使得健康管理更加人性化和科学.本文将介绍AI与健康管理的技术原理.实 ...

  9. 深度解读AIGC存储解决方案

    5月26日,2023数据基础设施技术峰会在苏州举办,腾讯云首席存储技术专家温涛受邀出席并分享了腾讯云领先的存储技术在AIGC场景中的应用,通过对AIGC业务流程和场景的提炼,从内容生成.内容审核和内容 ...

  10. Net 编译器平台 --- Roslyn

    引言 最近做一个功能想要动态执行C#脚本,就是预先写好代码片段,在程序运行时去执行代码段,比如像这样(以下代码为伪代码): string scriptText = "int a = 1;in ...