LINQ构建交叉表
最近碰到客户的一个需求。使用交叉表来显示客户数据。也就是以同时以行头和列头交叉形式显示数据内容。同时要求即使有些列没有数据,也需要显示该列内容,并设置默认值。
说明: “交叉表”对象是一个网格,用来根据指定的条件返回值。数据显示在压缩行和列中。这种格式易于比较数据并辨别其趋势。它由三个元素组成:
- 行
- 列
- 摘要字段
以下是SQL表的数据结构:
学生 |
课程 |
分数 |
王佳佳 |
语文 |
90 |
李晓华 |
语文 |
39 |
王佳佳 |
英语 |
42 |
李建军 |
英语 |
33 |
吴培华 |
数学 |
20 |
这是用于显示的表结构:
学生/课程 |
语文 |
英语 |
数学 |
物理 |
化学 |
地理 |
王佳佳 |
90 |
90 |
90 |
无 |
64 |
无 |
李晓华 |
无 |
69 |
90 |
90 |
无 |
无 |
李建军 |
78 |
83 |
无 |
64 |
无 |
无 |
吴培华 |
93 |
80- |
无 |
无 |
无 |
无 |
“交叉表”中的行沿水平方向延伸(从一侧到另一侧)。在上面的示例中,“课程” 是一行。
“交叉表”中的列沿垂直方向延伸(上下)。在上面的示例中,“学生” 是一列。
汇总字段位于行和列的交叉处。每个交叉处的值代表对既满足行条件又满足列条件的记录的汇总(求和、计数等)。在上面的示例中,“王佳佳”和“英语”交叉处的值是90,表示王佳佳的英语分数。
使用LINQ来筛选数据:
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("学生");
dt.Columns.Add("课程");
dt.Columns.Add("分数", typeof(int));
dt.Rows.Add("谢一帆", "语文", );
dt.Rows.Add("谢一帆", "英语", );
dt.Rows.Add("谢一帆", "数学", );
dt.Rows.Add("王佳佳", "英语", );
dt.Rows.Add("王佳佳", "数学", );
dt.Rows.Add("王佳佳", "化学", );
dt.Rows.Add("吴灵敏", "英语", );
dt.Rows.Add("胡虎珏", "化学", ); var groupedData = from b in dt.AsEnumerable()
group b by b.Field<string>("学生") into g
let list = g.ToList()
select new
{
学生 = g.Key,
语文 = list.Where(x => x.Field<string>("课程").Equals("语文")).Count().Equals() ? "无" : list.Find(x => x.Field<string>("课程").Equals("语文")).Field<int?>("分数").ToString(),
英语 = list.Where(x => x.Field<string>("课程").Equals("英语")).Count().Equals() ? "无" : list.Find(x => x.Field<string>("课程").Equals("英语")).Field<int?>("分数").ToString(),
数学 = list.Where(x => x.Field<string>("课程").Equals("数学")).Count().Equals() ? "无" : list.Find(x => x.Field<string>("课程").Equals("数学")).Field<int?>("分数").ToString(),
物理 = list.Where(x => x.Field<string>("课程").Equals("物理")).Count().Equals() ? "无" : list.Find(x => x.Field<string>("课程").Equals("物理")).Field<int?>("分数").ToString(),
化学 = list.Where(x => x.Field<string>("课程").Equals("化学")).Count().Equals() ? "无" : list.Find(x => x.Field<string>("课程").Equals("化学")).Field<int?>("分数").ToString(),
地理 = list.Where(x => x.Field<string>("课程").Equals("地理")).Count().Equals() ? "无" : list.Find(x => x.Field<string>("课程").Equals("地理")).Field<int?>("分数").ToString(),
}
; groupedData.ToList().ForEach(q => Console.WriteLine(q.学生 + " " + q.语文 + " " + q.英语 + " " + q.数学 + " " + q.地理));
Console.ReadLine();
}
Select内的语句嫌丑陋,还求高手指导予以修正。
打印结果:
LINQ构建交叉表的更多相关文章
- Quick BI的宝藏工具——交叉表
对于普通的表格展示数据,相信大家都非常熟悉了,今天给大家介绍的是BI领域的分析利器-交叉表,这个在BI分析场景中使用占比最多的分析利器.通过交叉表对数据的承载和管理,用户可以一目了然地分析出各种场景指 ...
- DevExpress XtraPivotGrid 交叉表 重复显示问题
转自:http://www.cnblogs.com/xiayan/archive/2011/11/04/2236389.html 最近发现xtrareport 的PivotGrid实现交叉表非常的简单 ...
- LINQ 联查多表数据并封装到ViewModel的实现
LINQ 联查多表数据并封装到ViewModel的实现 public List<MyTask> GetPagedTaskList(int pageIndex, int pageSize, ...
- Qlikview 处理交叉表数据
数据来源于crossTable的时候,如何将数据做明细显示. 如图示交叉表数据 使用表格向导,选择交叉表按钮, 结果达到目的. 相关脚本. Month, 表示将要新加的字段的列明,Orders 为明细 ...
- SQL交叉表
之前做货品横向展示时,有看到评论说用到交叉表. 公司最近需要给订单表做一个数据汇总的功能,同事给到一个参考SQL select * from (select COUNT(1) as 已锁定 from ...
- FastReport的交叉表实际使用的一个例子
计算发行-->定义份数月表(打开)出现 PosFraisPaysInput选择时间段后,点击“打印”.这个设计表格,就是交叉表. 交叉表的特点是:数据库是一条一条并列的但是出来的结果却是:横向是 ...
- mysql 行列动态转换(列联表,交叉表)
mysql 行列动态转换(列联表,交叉表) (1)动态,适用于列不确定情况 create table table_name( id int primary key, col1 char(2), col ...
- mysql 交叉表
交叉表,但在MySQL中却没有这个功能,但网上看到有不少朋友想找出一个解决方法,特发贴集思广义.http://topic.csdn.net/u/20090530/23/0b782674-4b0b-4c ...
- XtraReport交叉表隐藏列标题及自定义排序
1.隐藏列标题 用DevExpress PivotGrid report 做报表的时候,将字段拖放到报表中后,ColumnArea和DataArea会显示两个标题字段,如下图: 选中交叉表,设置以下属 ...
随机推荐
- css中元素居中总结
很多时候,我们需要让元素居中显示:1. 一段文本的水平居中,2. 一张图片的水平居中,3. 一个块级元素的水平居中:4. 单行文本的竖直居中,5. 不确定高度的一段文本竖直居中,6. 确定高度的块级元 ...
- selenium操作滚动条的几种方式
1.操作滚动条到当前可见视图的元素位置 WebElement element = dr.findElement(By.id("4")); ((JavascriptExecutor) ...
- codeforces 477B B. Dreamoon and Sets(构造)
题目链接: B. Dreamoon and Sets time limit per test 1 second memory limit per test 256 megabytes input st ...
- org.springframework.web.context.ContextLoaderListen 报错解决办法
今天搭建SSH项目的时候出现了如下错误: 严重: Error configuring application listener of class org.springframework.web.con ...
- TableLayout(表格布局)
表格布局模型以行列的形式管理子控件,每一行为一个TableRow的对象,当然也可以是一个View的对象.TableRow可以添加子控件,每添加一个为一列. TableLayout属性: android ...
- Jenkins学习一:Jenkins是什么?
文章转载:http://www.cnblogs.com/zz0412/tag/jenkins/default.html?page=1 第一章 Jenkins是什么? Jenkins 是一个可扩展的持续 ...
- java 20 - 9 带有缓冲区的字节输出流和字节输入流
由之前字节输入的两个方式,我们可以发现,通过定义数组读取数组的方式比一个个字节读取的方式快得多. 所以,java就专门提供了带有缓冲区的字节类: 缓冲区类(高效类) 写数据:BufferedOutpu ...
- Java的IO操作---File类
目标 1)掌握File类作用 2)可以使用file类中方法对文件进行读写操作. File类 唯一与文件有关的类.使用file类可进行创建或删除操作,要想使用File类,首先观察File类的构造方法. ...
- LUA 协程
LUA协程和C#协程非常相似,功能与用法更强大.基础用法: coco = coroutine.create(function (a,b) print("resume args:". ...
- Vue.js的表格分页组件
转自:http://www.cnblogs.com/Leo_wl/p/5522299.html 有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更 ...