用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. 运行预构建 Linux 映像的 Windows Azure 虚拟机中的交换空间 – 第 1 部分

    本文章由 Azure CAT 团队的 Piyush Ranjan (MSFT) 撰写. 随着基础结构服务(虚拟机和虚拟网络)近期在 Windows Azure 上正式发布,越来越多的企业工作负荷正在向 ...

  2. Andrew Ng Machine learning Introduction

    1. 机器学习的定义:Machine learning is programming computers to optimize a performance criterion(优化性能标准) usi ...

  3. 弹飞DZY(思维,打表,还没过全,先放着)

    弹飞DZYDescription某天,机智的ZZC发明了一种超级弹力装置,为了在他的朋友DZY面前显摆,他邀请DZY一起玩个游戏.游戏一开始,ZZC在地上沿着一条直线摆上n个装置,每个装置设定初始弹力 ...

  4. Tiny Spring 分析一

    近期一直想看spring的源代码,可是奈何水平太低,庞杂的源代码令我一阵阵的头晕. 非常有幸,在网上看到了黄亿华大神的<<1000行代码读懂Spring(一)- 实现一个主要的IoC容器& ...

  5. js 使用for循环遍历数组

    今天写个无聊的东西!for循环的使用! 例如以下:定义a数组,b为伪数组! var a = [1,2,3,0,5,4]; var b = document.getElementsByTagName(' ...

  6. asp.net弹出多个模态窗口

    asp.net中无限制弹出模态窗口 特点: 1.       可以在模态窗口上再弹出模态窗口,不限制次数 2.       弹出窗口的支持拖放,及调整大小 3.       弹出窗口关闭后可以动态控制 ...

  7. 深度学习工具caffe具体安装指南

    caffe安装指南-吐血整理 前言: 在一台系统环境较好的linux机器上能够非常easy的安装caffe,可是假设系统本身非常旧,又没有GPU的话.安装就太麻烦了,全部都得从头做起,本文档旨在尽可能 ...

  8. DataTable 修改列名 删除列 调整列顺序

    DataTable myDt =dt;//删除列myDt.Columns.Remove("minArea");myDt.Columns.Remove("maxArea&q ...

  9. STMP发送邮件被当垃圾邮件处理的解决方法

    昨天使用了.Net通过smtp发送邮件的方式发送了一封邮件到自己的QQ邮箱,但是发送成功后并没有提示邮箱收到新的邮件,而且去收件箱里面也没有新增的邮件. 这让本人觉得奇怪,所以就觉得是否被当作垃圾邮件 ...

  10. 【转】在Spring中基于JDBC进行数据访问时怎么控制超时

    http://www.myexception.cn/database/1651797.html 在Spring中基于JDBC进行数据访问时如何控制超时 超时分类 超时根据作用域可做如下层级划分: Tr ...