用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实现行列转换的更多相关文章

  1. datatable 行列转换

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. Oracle学习之路-- 案例分析实现行列转换的几种方式

    注:本文使用的数据库表为oracle自带scott用户下的emp,dept等表结构. 通过一个例子来说明行列转换: 需求:查询每个部门中各个职位的总工资 按我们最原始的思路可能会这么写:       ...

  3. SQL Server中行列转换 Pivot UnPivot

    SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...

  4. SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子

    使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UN ...

  5. 如何用Pivot实现行列转换

    在Oracle中,如果要实现行列转换,较为常见的是用DECODE和CASE语句.对于简单的行列转行,DECODE和CASE语句尚能应付.在逻辑比较复杂,分组聚合较多的场景中,DECODE和CASE语句 ...

  6. SQL Server SQL性能优化之--pivot行列转换减少扫描计数优化查询语句

    原文出处:http://www.cnblogs.com/wy123/p/5933734.html 先看常用的一种表结构设计方式: 那么可能会遇到一种典型的查询方式,主子表关联,查询子表中的某些(或者全 ...

  7. SQL SERVER 合并重复行,行列转换

    引用自:http://www.cnblogs.com/love-summer/archive/2012/03/27/2419778.html sql server2000 里面如何实现oracle10 ...

  8. SQL中PIVOT 行列转换

    来源:http://www.studyofnet.com/news/295.html PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列 ...

  9. 在Sqlserver下巧用行列转换日期的数据统计

    在Sqlserver下巧用行列转换日期的数据统计 前言 在SQLSERVER 中有很多统计函数的基础语法,有使用Group By 或 partition by 后配合Sum,Count(*) 等用法. ...

随机推荐

  1. OpenNMS Log Correlator

  2. WPF的重要新概念

    原文 http://www.cnblogs.com/free722/archive/2011/11/12/2238654.html 逻辑树与可视树 XAML天生就是用来呈现用户界面的,这是由于它具有层 ...

  3. ViewTreeObserver简介

    Android ViewTreeObserver简介 一.结构 public final class ViewTreeObserver extends Object java.lang.Object ...

  4. UberX及以上级别车奖励政策(优步北京第四组)

    优步北京第四组: 定义为2015年7月20日至今激活的司机(以优步后台数据显示为准) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司机(全国版最新最详细 ...

  5. 仅仅需手动添加一行代码就可以让Laravel4执行在SAE (v. 1.0.0)

    Github:https://github.com/chariothy/laravel4-sae (已更新至v1.1.0) laravel4-sae (v. 1.0.0) 仅仅需手动添加一行代码就可以 ...

  6. SQL练习之不破坏应用程序现有查询的修改模式

    当我还是一个菜鸟的时候,当然现在也是,当我的软件需求发生变化时,并且数据库设计同样要求发生变化,我通常会放弃原有的代码(或者对原有的代码进行大改),先在我知道了两个不破坏应用程序现有查询的修改模式,下 ...

  7. 使用jsp标签和java资源管理实现jsp支持多语言

    1.编写一个Serverlet并设置服务器启动是初始化该Servlet,并在初始化方法中实现对java的资源加载: DispatcherServlet.java package mypack; imp ...

  8. ExtJs中的Grid具体操作(笔记及心得)

    一.基本操作步骤 var cm=new Ext.grid.ColumnModel([ //对列的定义,cm是它的简写,作为真个表格的列模式,需要首先创建的{header:'编号',dataIndex: ...

  9. Linux常用指令(待补充)

    1.cd进入目录 2../shuntdown.sh  停止tomcat 3.ps -ef |grep +进程名  查看进程状态 4.kill +进程名   强杀kill -9 +进程 5./start ...

  10. c++ build options(important)

    The C runtime library  4 versions: Multi-threaded (/MT) Multi-threaded Debug (/MTd) Multi-threaded D ...