最近碰到客户的一个需求。使用交叉表来显示客户数据。也就是以同时以行头和列头交叉形式显示数据内容。同时要求即使有些列没有数据,也需要显示该列内容,并设置默认值。

说明: “交叉表”对象是一个网格,用来根据指定的条件返回值。数据显示在压缩行和列中。这种格式易于比较数据并辨别其趋势。它由三个元素组成:

  • 摘要字段

以下是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构建交叉表的更多相关文章

  1. Quick BI的宝藏工具——交叉表

    对于普通的表格展示数据,相信大家都非常熟悉了,今天给大家介绍的是BI领域的分析利器-交叉表,这个在BI分析场景中使用占比最多的分析利器.通过交叉表对数据的承载和管理,用户可以一目了然地分析出各种场景指 ...

  2. DevExpress XtraPivotGrid 交叉表 重复显示问题

    转自:http://www.cnblogs.com/xiayan/archive/2011/11/04/2236389.html 最近发现xtrareport 的PivotGrid实现交叉表非常的简单 ...

  3. LINQ 联查多表数据并封装到ViewModel的实现

    LINQ 联查多表数据并封装到ViewModel的实现 public List<MyTask> GetPagedTaskList(int pageIndex, int pageSize, ...

  4. Qlikview 处理交叉表数据

    数据来源于crossTable的时候,如何将数据做明细显示. 如图示交叉表数据 使用表格向导,选择交叉表按钮, 结果达到目的. 相关脚本. Month, 表示将要新加的字段的列明,Orders 为明细 ...

  5. SQL交叉表

    之前做货品横向展示时,有看到评论说用到交叉表. 公司最近需要给订单表做一个数据汇总的功能,同事给到一个参考SQL select * from (select COUNT(1) as 已锁定 from ...

  6. FastReport的交叉表实际使用的一个例子

    计算发行-->定义份数月表(打开)出现 PosFraisPaysInput选择时间段后,点击“打印”.这个设计表格,就是交叉表. 交叉表的特点是:数据库是一条一条并列的但是出来的结果却是:横向是 ...

  7. mysql 行列动态转换(列联表,交叉表)

    mysql 行列动态转换(列联表,交叉表) (1)动态,适用于列不确定情况 create table table_name( id int primary key, col1 char(2), col ...

  8. mysql 交叉表

    交叉表,但在MySQL中却没有这个功能,但网上看到有不少朋友想找出一个解决方法,特发贴集思广义.http://topic.csdn.net/u/20090530/23/0b782674-4b0b-4c ...

  9. XtraReport交叉表隐藏列标题及自定义排序

    1.隐藏列标题 用DevExpress PivotGrid report 做报表的时候,将字段拖放到报表中后,ColumnArea和DataArea会显示两个标题字段,如下图: 选中交叉表,设置以下属 ...

随机推荐

  1. Hello world S.B.S.

    #include <iostream> #include <conio.h> #include<cstdio> #include<cstring> #i ...

  2. 实习小记-python 内置函数__eq__函数引发的探索

    乱写__eq__会发生啥?请看代码.. >>> class A: ... def __eq__(self, other): # 不论发生什么,只要有==做比较,就返回True ... ...

  3. sqlzoo.net刷题5

    List the continents that have a total population of at least 100 million. 这题考察的是使用集聚函数生成表之后,如何过滤 一般我 ...

  4. jquery堆栈与队列

    期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待期待

  5. 【转】【Asp.Net】ASP.NET中自定义控件无法响应事件

    在自定义服务器控件中增加事件处理程序,但代码运行时没有错误,按钮点击下去却没有反应.应该如何处理呢?(本例中,该自定义控件包括一个Button,和一个Label,我希望用户点击了这个Button后,改 ...

  6. Gruntjs: task之文件映射

    由于大多数的任务执行文件操作,Grunt提供了一个强大的抽象声明说明任务应该操作哪些文件.这里总结了几种src-dest(源文件-目标文件)文件映射的方式,提供了不同程度的描述和控制操作方式. 1. ...

  7. ASP.NET中进行消息处理(MSMQ) 一

    MSMQ是微软消息队列的英文缩写.那么什么是消息队列?这些介绍网上一大片这里就不多说了.本文对于大虾级的人物来说这只是小玩意而已,对于初学者来说这文章还是有一定的帮助,希望路过的大虾们别笑话我班门弄斧 ...

  8. An Introduction to Interactive Programming in Python (Part 1) -- Week 2_1 练习

    # Practice Exercises for Functions # Solve each of the practice exercises below. # 1.Write a Python ...

  9. Linux(12.1-12.6)学习笔记

    第十二章 并发编程 如果逻辑控制流在时间上重叠,那么他们就是并发的.应用级并发在以下情况中发挥作用: 访问慢速I/O设备. 与人交互. 通过推迟工作以降低延迟. 服务多个网络客户端. 在多核机器上进行 ...

  10. nodejs初学————安装篇(iis8.5+windows8.1)

    nodejs很久前就想玩玩,不过一直没时间,昨晚花了4个小时来捣鼓到iis上架设成功了,废话不说了. PS:我的系统是windows8.1 x64,所以自带iis8.5的,下载的文件也是x64的. N ...