Pivot Table 实现详解(一)

简介:

Pivot Table 是数据透视表的意思,如下一个普通的数据集:

image

当按日期作为x轴,客户ID作为y轴,利润作为数据(SUM),转换为数据透视表后呈现为:

image

其中的利润数据将被合计,而无数据的位置被“-”字符代替。

那么实现一个这样的数据展现模式,方法有多种,在排开专用工具软件之外,一般存在三种方式:

一、使用支持多维展示数据的网格控件或报表控件。

二、编写SQL来实现。

三、通过编程开发自定义的函数将数据做转换。

这三种方式,它们各有优缺点:

一、使用网格控件则必须购买三方厂商开发的组件,而报表工具/组件则只能在特定的场景应用并展示数据。

二、SQL方式只是相对灵活,但如果x轴是动态的,如年月日,或者是某个项目(没有参照表),就需要代码来拼接SQL,不能写死,但这种方式的功能却很强大,像聚合函数之类的,通常在报表中,就是先写SQL尽可能的接近于最终格式,再使用报表工具优化或处理数据格式。

三、编程方式,优点是可以很灵活的公开接口和实现需求,缺点是如果要做的完善,工作强度相对比较大(技术基础,开发时间,可用性,稳定性,性能)。

通常要满足一、二两点,是相对容易的,而第三点编程方式相对来说,可利用的资源不多;因为最合适的还是自己根据项目需求而定制开发的。

那么针对第三点编程方式的思路做以下讲解:

一、数据透视表的x轴和y轴的

这里的x轴和y轴表示为如图:

image

x轴的列提取:

image

构造新内存表;
排除X轴字段和数据字段,将其他字段生成Y轴列;
foreach (数据列 列 in 原始表.列集合)
if (列名称!=X轴字段 && 列名称!=数据字段)
新内存表.增加列(列);
从数据中找出列字段值生成列;
foreach (数据行 行 in 原始表.行集合)
if (行[X轴字段]不存在)
新内存表.增加列(行[X轴字段]);

y轴的数据分组过滤和数据列填入:

image

//遍历数据,填写数据
foreach (数据行 行 in 原始表.行集合)
{
//比较分组列数据,保持唯一
string 比较值一 = 行[Y轴字段];
bool 存在相同 = 新内存表.行集合.查找(比较值一);
//无相同的,则增加到分组数据集合
if (!存在相同)
{
构造内存表新行;
//复制分组列数据
新行[Y轴列] = 行[Y轴列] ;
}
//查找数据列的数据
foreach (数据行 查找行 in 新内存表.行集合)
{
string 比较值二 = 查找行[Y轴字段];
//如果和分组数据相同,则增加到对应的数据单元格
if (比较值一==比较值二)
查找行[行[X轴列] + ""] = 行[数据列];
}
}

二、数据列的聚合实现

聚合函数运算,思路是在填写x轴的数据字段数据的时候,将它的原始值登记到一个运算表内,作为存储;其中y轴数据作为key,x轴数据作为它子集的key,再在其中存放一个有序的List,其中存放的则是每行的原始数据值。

//聚合函数运算表
Dictionary<y轴列行数据, Dictionary<x轴列, List<x轴列数据集合>>> expressRows;

image

此图比较大,请配合下面的伪码

//拿到了集合,后计算聚合函数和填充空文本
foreach (数据行 查找行 in 新内存表.行集合)
{
string 比较值二 =查找行[Y轴字段];
//查找需要计算的单元格
foreach (string x轴列 in x轴列集合)
{
decimal avg, sum, max, min;
avg = sum = max = min = 0;
//排除空
if (聚合函数运算表.ContainsKey(比较值二) && 聚合函数运算表[比较值二].ContainsKey(x轴列))
{
//生成聚合结果
foreach (decimal d in 聚合函数运算表[比较值二][x轴列])
{
avg += d;
sum += d;
if (d > max) max = d;
if (min == 0) min = d;
if (min > d) min = d;
}
//平均特殊处理
if (聚合函数运算表[比较值二][x轴列].Count > 0)
avg = avg / 聚合函数运算表[比较值二][x轴列].Count;
else
avg = 0;
//分配聚合结果
if (dataExpression != PivotDataExpression.None)
{
switch (dataExpression)
{
case PivotDataExpression.Avg:
查找行[x轴列] = avg;
break;
case PivotDataExpression.Max:
查找行[x轴列]= max;
break;
case PivotDataExpression.Sum:
查找行[x轴列]= sum;
break;
case PivotDataExpression.Min:
查找行[x轴列]= min;
break;
case PivotDataExpression.Count:
查找行[x轴列]= 聚合函数运算表[比较值二][x轴列].Count;
break;
}
}
}

//填充空文本
if (查找行.IsNull(x轴列))
查找行[x轴列]= 空文本;
}
}

三、x轴和y轴的合计或公式套用的灵活实现

待续……

四、x轴和y轴的合计列实现

待续……




本文转自suifei博客园博客,原文链接:http://www.cnblogs.com/Chinasf/archive/2008/04/13/1151368.html,如需转载请自行联系原作者

相关文章
|
Web App开发
vscode设置默认浏览器
vscode设置默认浏览器
1027 1
|
11月前
|
XML 前端开发 JavaScript
2025 年最新 CSS 面试题 100 道及详细答案解析
本文整理了100道CSS面试题及答案,涵盖基础概念、选择器与特性、布局(如Flexbox和Grid)、动画与过渡、响应式设计等核心内容。从CSS的基础知识如盒模型、`box-sizing`属性,到高级应用如伪类选择器(LVHA、CSS3新增伪类)和视觉格式化模型(BFC),帮助开发者系统掌握CSS技能。此外,还涉及浏览器兼容性、CSS优化及预处理器等内容,为前端工程师提供全面的学习资源。资源可从[此链接](https://pan.quark.cn/s/50438c9ee7c0)获取。
785 5
|
6月前
|
人工智能 算法 搜索推荐
2025年国内数字人平台选购指南:聚焦全链路能力,告别工具碎片化困境
国内数字人平台众多,功能参差,用户常陷多工具切换、成本高、效率低困境。本文基于2025年实测数据,从全链路集成、场景适配、技术壁垒、成本效益四大维度,深度解析必火AI、火山、阿里、讯飞等主流平台,助你避开选择陷阱,精准匹配个人IP、电商直播、企业服务等应用场景,实现高效视频化转型。
|
6月前
|
Java Linux 开发工具
Linux 安装 JDK 8 jdk-8u291-linux-x64.tar.gz 详细步骤教程(附安装包)
下载JDK 8安装包并解压至Linux系统(如/opt目录),配置JAVA_HOME、PATH和CLASSPATH环境变量,最后通过java -version和javac -version验证安装成功,即可运行Java程序。
1928 0
|
存储 Cloud Native 安全
阿里云目前优惠券最新种类、金额及使用区别参考
目前阿里云为用户推出了无门槛优惠券,上云抵扣金、算力补贴优惠券、上云礼包等不同种类的优惠券,助力更多用户优惠上云,但是这些优惠券在领取和使用规则上是不同的,本文为大家介绍目前阿里云的各种优惠券领取和使用注意事项,以供大家了解自己能领取或者申请哪些优惠券,在使用过程中需要注意什么。
阿里云目前优惠券最新种类、金额及使用区别参考
|
中间件 Linux vr&ar
Centos7升级Glibc
Centos7升级Glibc
2403 6
|
SQL 存储 分布式计算
阿里云 Paimon + MaxCompute 极速体验
Paimon 和 MaxCompute 的对接经历了长期优化,解决了以往性能不足的问题。通过半年紧密合作,双方团队专门提升了 Paimon 在 MaxCompute 上的读写性能。主要改进包括:采用 Arrow 接口减少数据转换开销,内置 Paimon SDK 提升启动速度,实现原生读写能力,减少中间拷贝与转换,显著降低 CPU 开销与延迟。经过双十一实战验证,Paimon 表的读写速度已接近 MaxCompute 内表,远超传统外表。欢迎体验!
|
机器学习/深度学习 人工智能 算法
为什么ChatGPT等AI大模型都是基于Python开发?
为什么ChatGPT等AI大模型都是基于Python开发?
800 0
|
存储 SQL JSON
Hologres技术揭秘,JSON半结构化数据的极致分析性能
本文将会揭秘Hologres JSONB半结构化数据的技术原理,实现JSON半结构数据的极致分析性能。
3478 59
Hologres技术揭秘,JSON半结构化数据的极致分析性能
|
网络协议 测试技术 网络架构
网络性能测试工具iperf详细使用图文教程zz
http://blog.csdn.net/zm_21/article/details/25868589 Iperf的主要功能如下: TCP 测量网络带宽 报告MSS/MTU值的大小和观测值 支持TCP窗口值通过套接字缓冲 当P线程或Win32线程可用时,支持多线程。
3854 0