LINQ实现行列转换
用SQL语句实现行列转换很容易,但也有时候需要在程序中实现,找了好久,发现一篇文章写的挺不错的
http://blog.csdn.net/smartsmile2012/article/details/8259192
用LINQ实现的行列转换,借鉴了他的办法,修改了下,达到了想要的效果
原始表:

想要达到的效果:

private void Form1_Load(object sender, EventArgs e)
{
//创建表,添加数据作为数据源
DataTable dtSource = new DataTable();
dtSource.Columns.Add(new DataColumn("Name",typeof(string)));//姓名
dtSource.Columns.Add(new DataColumn("DateTime", typeof(string)));//日期
dtSource.Columns.Add(new DataColumn("WorkType", typeof(string)));//上班类型 dtSource.Rows.Add("张三","周一","早班");
dtSource.Rows.Add("张三", "周二", "晚班");
dtSource.Rows.Add("张三", "周三", "早班");
dtSource.Rows.Add("小李", "周二", "早班");
dtSource.Rows.Add("小李", "周四", "早班");
dtSource.Rows.Add("小李", "周五", "早班");
dtSource.Rows.Add("小王", "周一", "晚班");
dtSource.Rows.Add("小王", "周三", "晚班");
dtSource.Rows.Add("小王", "周五", "晚班"); gc.DataSource=GetTable(dtSource); //输出转换后的表(这用的是DEV控件的GridView)
} /// <summary>
/// 实现行列转换
/// </summary>
private DataTable GetTable(DataTable dtSource)
{
//创建转换后的表,固定列
DataTable dt = new DataTable();
dt.Columns.Add("NAME", typeof(string)); //名称
dt.Columns.Add("WEEK1", typeof(string)); //周一
dt.Columns.Add("WEEK2", typeof(string)); //周二
dt.Columns.Add("WEEK3", typeof(string)); //周三
dt.Columns.Add("WEEK4", typeof(string)); //周四
dt.Columns.Add("WEEK5", typeof(string)); //周五
string[] times = new string[] { "周一", "周二", "周三", "周四", "周五" };//存放日期作为筛选条件 //x[0]为NAME,按NAME 分组
var data = from x in dtSource.Rows.Cast<DataRow>()
group x by x[] into g
select new { Key = g.Key.ToString(), Items = g };
data.ToList().ForEach(x =>
{
string[] array = new string[dt.Columns.Count];
array[] = x.Key;//NAME
int m = ;
for (int i = ; i < dt.Columns.Count; i++)
{
array[i] = (from y in x.Items
where y[].ToString() == times[m] //y[1]为日期,上面的times为筛选条件
select y[].ToString()).SingleOrDefault();//筛选出来的上班类型
m++;
};
dt.Rows.Add(array);
}
);
return dt;
}
输出的效果图:

LINQ实现行列转换的更多相关文章
- datatable 行列转换
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Oracle学习之路-- 案例分析实现行列转换的几种方式
注:本文使用的数据库表为oracle自带scott用户下的emp,dept等表结构. 通过一个例子来说明行列转换: 需求:查询每个部门中各个职位的总工资 按我们最原始的思路可能会这么写: ...
- SQL Server中行列转换 Pivot UnPivot
SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...
- SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子
使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UN ...
- 如何用Pivot实现行列转换
在Oracle中,如果要实现行列转换,较为常见的是用DECODE和CASE语句.对于简单的行列转行,DECODE和CASE语句尚能应付.在逻辑比较复杂,分组聚合较多的场景中,DECODE和CASE语句 ...
- SQL Server SQL性能优化之--pivot行列转换减少扫描计数优化查询语句
原文出处:http://www.cnblogs.com/wy123/p/5933734.html 先看常用的一种表结构设计方式: 那么可能会遇到一种典型的查询方式,主子表关联,查询子表中的某些(或者全 ...
- SQL SERVER 合并重复行,行列转换
引用自:http://www.cnblogs.com/love-summer/archive/2012/03/27/2419778.html sql server2000 里面如何实现oracle10 ...
- SQL中PIVOT 行列转换
来源:http://www.studyofnet.com/news/295.html PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列 ...
- 在Sqlserver下巧用行列转换日期的数据统计
在Sqlserver下巧用行列转换日期的数据统计 前言 在SQLSERVER 中有很多统计函数的基础语法,有使用Group By 或 partition by 后配合Sum,Count(*) 等用法. ...
随机推荐
- Android_Intent意图详解
本博文为子墨原创,转载请注明出处! http://blog.csdn.net/zimo2013/article/details/11863857 1.Intent作用 Intent是一个将要执行的动作 ...
- 解析配置文件ConfigParser模块
一.ConfigParser简介 ConfigParser 是用来读取配置文件的包.配置文件的格式如下:中括号“[ ]”内包含的为section.section 下面为类似于key-value 的配置 ...
- eclipse中删除多余的工作空间记录
所以对于不再使用的工作空间,每次出现在eclipse的“文件”>>“切换工作空间”里面的时候就觉得特别不爽. 所以认真研究了eclipse目录之后让我找到了,删除不需要工作空间记录的方法. ...
- iOS 常用第三方
MWPhotoBrowser 非常好用的图片浏览器 FDFullscreenPopGesture 用于全屏滑动切换视图 Aspects 用于快速AOP编程 AFNetworking iOS开发中最为火 ...
- WinForm 控件的布局(Dock属性)的注意点
对于Dock属性,添加控件的顺序会影响它们停驻的方式.例如,如果你对窗体添加控件A,指示其停驻填充(Fill), 然后你对窗体添加控件B并指示其停驻顶部(Top),控件B将覆盖控件A的上部.原因就是控 ...
- C++/C#结构体转化-二维数组-bytes To Strings
C++结构体 typedef struct VidyoClientRequestGetWindowsAndDesktops_ { /*! The number of application windo ...
- vue.js自定义指令入门
Vue.js 允许你注册自定义指令,实质上是让你教 Vue 一些新技巧:怎样将数据的变化映射到 DOM 的行为.你可以使用Vue.directive(id, definition)的方法传入指令id和 ...
- 浅谈Spring(三)
一.基础Spring的标准测试 1.导入spring与junit继承的jar 2.引入注解 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfig ...
- JavaScript中的闭包理解
原创文章,转载请注明:JavaScript中的闭包理解 By Lucio.Yang 1.JavaScript闭包 在小学期开发项目的时候,用node.js开发了服务器,过程中遇到了node.js的第 ...
- 以Android环境为例的多线程学习笔记(二)-----------------锁和条件机制
现在的绝大多数应用程序都是多线程的程序,而当有两个或两个以上的线程需要对同一数据进行存取时,就会出现条件竞争,也即 是这几个线程中都会有一段修改该数据状态的代码.但是如果这些线程的运行顺序推行不当的话 ...