LINQ构建交叉表

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

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



  • 摘要字段

以下是SQL表的数据结构:


























学生

课程

分数

王佳佳

语文

90

李晓华

语文

39

王佳佳

英语

42

李建军

英语

33

吴培华

数学

20

这是用于显示的表结构:










































学生/课程

语文

英语

数学

物理

化学

地理

王佳佳

90

90

90

64

李晓华

69

90

90

李建军

78

83

64

吴培华

93

80-

“交叉表”中的行沿水平方向延伸(从一侧到另一侧)。在上面的示例中,“课程”
是一行。
    “交叉表”中的列沿垂直方向延伸(上下)。在上面的示例中,“学生”
是一列。
   
汇总字段位于行和列的交叉处。每个交叉处的值代表对既满足行条件又满足列条件的记录的汇总(求和、计数等)。在上面的示例中,“王佳佳”和“英语”交叉处的值是90,表示王佳佳的英语分数。

使用LINQ来筛选数据:


 1  static void Main(string[] args)
2 {
3 DataTable dt = new DataTable();
4 dt.Columns.Add("学生");
5 dt.Columns.Add("课程");
6 dt.Columns.Add("分数", typeof(int));
7 dt.Rows.Add("谢一帆", "语文", 68);
8 dt.Rows.Add("谢一帆", "英语", 58);
9 dt.Rows.Add("谢一帆", "数学", 48);
10 dt.Rows.Add("王佳佳", "英语", 90);
11 dt.Rows.Add("王佳佳", "数学", 91);
12 dt.Rows.Add("王佳佳", "化学", 90);
13 dt.Rows.Add("吴灵敏", "英语", 65);
14 dt.Rows.Add("胡虎珏", "化学", 78);
15
16
17 var groupedData = from b in dt.AsEnumerable()
18 group b by b.Field<string>("学生") into g
19 let list = g.ToList()
20 select new
21 {
22 学生 = g.Key,
23 语文 = list.Where(x => x.Field<string>("课程").Equals("语文")).Count().Equals(0) ? "无" : list.Find(x => x.Field<string>("课程").Equals("语文")).Field<int?>("分数").ToString(),
24 英语 = list.Where(x => x.Field<string>("课程").Equals("英语")).Count().Equals(0) ? "无" : list.Find(x => x.Field<string>("课程").Equals("英语")).Field<int?>("分数").ToString(),
25 数学 = list.Where(x => x.Field<string>("课程").Equals("数学")).Count().Equals(0) ? "无" : list.Find(x => x.Field<string>("课程").Equals("数学")).Field<int?>("分数").ToString(),
26 物理 = list.Where(x => x.Field<string>("课程").Equals("物理")).Count().Equals(0) ? "无" : list.Find(x => x.Field<string>("课程").Equals("物理")).Field<int?>("分数").ToString(),
27 化学 = list.Where(x => x.Field<string>("课程").Equals("化学")).Count().Equals(0) ? "无" : list.Find(x => x.Field<string>("课程").Equals("化学")).Field<int?>("分数").ToString(),
28 地理 = list.Where(x => x.Field<string>("课程").Equals("地理")).Count().Equals(0) ? "无" : list.Find(x => x.Field<string>("课程").Equals("地理")).Field<int?>("分数").ToString(),
29 }
30 ;
31
32 groupedData.ToList().ForEach(q => Console.WriteLine(q.学生 + " " + q.语文 + " " + q.英语 + " " + q.数学 + " " + q.地理));
33 Console.ReadLine();
34 }

Select内的语句嫌丑陋,还求高手指导予以修正。

打印结果:

LINQ构建交叉表

时间: 2024-10-12 22:53:54

LINQ构建交叉表的相关文章

DevExpress XtraReports 入门六 控件以程序方式创建一个 交叉表 报表

原文:DevExpress XtraReports 入门六 控件以程序方式创建一个 交叉表 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的,为了帮助更多的人不会像我这样浪费时间才写的这篇文章,高手不想的看请路过 本文内容来DevExpress XtraReports帮助文档,如看过类似的请略过. 废话少说 开始正事 在继续本示例之前,要把所有 必需的程序集 添加到项目的 引用 列表中,并且把一个按钮拖放到窗体上. 然后,以下列方式接管此按钮的

DevExpress XtraReports 入门五 创建交叉表报表

原文:DevExpress XtraReports 入门五 创建交叉表报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的,为了帮助更多的人不会像我这样浪费时间才写的这篇文章,高手不想的看请路过 本文内容来DevExpress XtraReports帮助文档,如看过类似的请略过. 废话少说 开始正事 一.准备数据绑定 XRPivotGrid 控件 启动 MS Visual Studio (2005.2008 或 2010),并且新建一个或者打开一个现

JasperReport报表开发之转置交叉表

使用Jasper或BIRT等报表工具时,常会碰到一些非常规的统计,用报表工具本身或SQL都难以处理,比如源数据不符合交叉表的要求,需要转置后再呈现.集算器具有结构化强计算引擎,集成简单,可以协助报表工具方便地实现此类需求.下面通过一个例子来说明转置交叉表的实现过程. 数据库表booking汇总着各年度商品的预定数据,有四个字段,包括年份和三种预定状态,部分数据如下: 报表要求呈现指定年份及上一年的预定情况,其中行组有三项,即三种预定状态,列组是年份,测度是当年的预定数据.此外要汇总出指定年份各预

交叉表、行列转换和交叉查询经典

交叉表.行列转换和交叉查询经典分类: SqlServer 2007-12-05 16:01 6776人阅读 评论(1) 收藏 举报sqlsqlserverinsertnull产品sql server交叉表.行列转换和交叉查询经典一.什么是交叉表“交叉表”对象是一个网格,用来根据指定的条件返回值.数据显示在压缩行和列中.这种格式易于比较数据并辨别其趋势.它由三个元素组成: 行列摘要字段“交叉表”中的行沿水平方向延伸(从一侧到另一侧).在上面的示例中,“手套”(Gloves) 是一行.“交叉表”中的

报表引擎交叉表的报表设计示例

使用Delphi开发了一个报表引擎,以下是一个交叉表的示例: 报表引擎交叉表的报表设计示例

SPSS-多重响应-频率和交叉表案例分析(问卷调查分析)

在10.1休假前,希望跟大家讨论一下SPSS-多重响应--频率和交叉表分析,希望大家能够多提点提点 在云南电信网上营业厅做了一个关于"客户不使用电信3g业务的原因有哪些的问卷调查,问题所示: 这份问卷调查总更有35人参与,样本容量偏少,其中 1:选择 A :3G资费过高的有 14人 2:选择 B:  网络覆盖率低,信号不稳定的  15人 3:选择 C:买手机太麻烦的  15人 4:选择 D: 换手机号麻烦  15人 5:选择 E: 3G功能用处不大 9人 6:选择F: 朋友使用后,觉得不好  1

SQL交叉表

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

EF框架下 Linq语句多表联查排序实例

一些原因需要用到linq的多表联查,网上查了下资料,顺便整理了一下,包括了模糊查询,分页,排序字段. 话不多说,直接上代码 public List<ExamineUserEntity> GetUserExamineList(string username, string phone, int pageindex, int pagesize) { var query = (from exam in db.T_USEREXAMINE join user in db.T_EXAMINE_USER o

【原创】POSTGRESQL交叉表的实现

这里我来演示下在POSTGRESQL里面如何实现交叉表的展示,至于什么是交叉表,我就不多说了,度娘去哦. 原始表数据如下: t_girl=# select * from score;  name  | subject | score  -------+---------+-------  Lucy  | English |   100  Lucy  | Physics |    90  Lucy  | Math    |    85  Lily  | English |    95  Lily