首页 > 其他分享 >PivotGridControl自定义行数据的统计公式

PivotGridControl自定义行数据的统计公式

时间:2023-09-14 22:44:07浏览次数:48  
标签:PivotGridControl 班次 自定义 公式 Sum 数据类型 pds && Select

我们在使用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,班次,自定义,公式,Sum,数据类型,pds,&&,Select
From: https://www.cnblogs.com/ckym/p/17703729.html

相关文章

  • 分享一个自定义颜色的侧边栏CSS
    很简单!将以下代码放入站点的css即可生效,css中的颜色可自定义修改RGB/HEX的颜色值~/**彩色滚动条样式开始*/::-webkit-scrollbar{width:10px;height:1px;}::-webkit-scrollbar-thumb{background-color:#a0c595;background-image:-webkit-linear-gradient(45......
  • 更改Eclipse下Tomcat的部署目录和自定义user library
     更改Eclipse下Tomcat的部署目录http://kingxss.iteye.com/blog/1741438自定义userlibrary......
  • vue 数学公式js加载
    <script>document.addEventListener("DOMContentLoaded",function(){renderMathInElement(document.body,{//customisedoptions//•auto-renderspecifickeys,e.g.:delimiters:[{left:'$......
  • 自定义内存分配在 uC/OS-II 中的应用
    uC/OS-II是一个广泛用于嵌入式系统的实时操作系统内核,它提供了强大的多任务管理和调度功能。在嵌入式应用中,内存管理是一个至关重要的问题,而uC/OS-II允许开发人员自定义内存分配策略,以满足不同应用的需求。本文将讨论在uC/OS-II中如何进行自定义内存分配,并提供相关的代码演示......
  • uni-app 自定义头部 安全距离
    APP.vue  divHeight:'', paddingHeight:'',方法uni.getSystemInfo({ success:(res)=>{ //获取到手机状态栏的高度 letmenuButtonInfo=uni.getMenuButtonBoundingClientRect() console.log('右边胶囊信息',menuButtonInfo) ......
  • 自定义类型-结构体(结构体,枚举,联合)2
       上节写到结构体对齐数,以及系统默认对齐数的修改,以及对齐数为何出现,实际上是牺牲一部分空间来换取读取速度也就是时间的方法。在这里插入一段结构体函数传参的内容以下代码为结构体初始化,使用自定义函数进行初始化,传递的时候使用了结构体地址。structS{ inta; charc......
  • 《动手学深度学习 Pytorch版》 5.4 自定义层
    5.4.1不带参数的层importtorchimporttorch.nn.functionalasFfromtorchimportnnclassCenteredLayer(nn.Module):def__init__(self):super().__init__()defforward(self,X):returnX-X.mean()#仅作减去均值的操作layer=......
  • ODPS/MaxComputer 自定义UDF、UDTF函数
    ODPS/MaxComputer自定义UDF、UDTF函数前置条件:创建Maven工程导入jar包和打包工具:<dependency><groupId>com.aliyun.odps</groupId><artifactId>odps-sdk-udf</artifactId><version>0.29.10-public</ver......
  • 自定义镜像-镜像结构
       ......
  • Eclipse自定义右键New菜单
    定制new菜单,点Window–>CustomizePerspective:选择new菜单所显示的快捷菜单......