用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. delphi 修改代码补全的快捷键(由Ctrl+Space 改为 Ctrl + alt + Space)

    delphi 的IDE快捷键与输入法切换键中突,以往的解决方法是下载一个ImeTool修改 windows 系统的快捷键 在 xp win7 都好使,但在win 10经常是修改完后,重启又失效了. 本 ...

  2. Python之lxml

    作者:Shane 出处:http://bluescorpio.cnblogs.com lxml takes all the pain out of XML. Stephan Richter lxml是 ...

  3. android可拖动排序GridView实现

    经常使用今日头条.网易新闻的同学们应该都会注意到用于管理多个频道的可拖动排序GridView,下面介绍一下可拖动的DragGridView的实现方法.代码放在GitHub上https://github ...

  4. 【转】SQL Server 2008 新类型介绍之Date和Time

     转自CSDN TJVictor专栏:http://blog.csdn.net/tjvictor/archive/2009/07/13/4344429.aspx   SQL Server 2008除了 ...

  5. 深入理解java虚拟机系列二——垃圾收集算法

    在主流的商用程序语言中大多都是用根搜索算法(GC Roots Tracing)判断对象是否存活,比如java,c#等.当从GC Roots到某个对象不可达,则证明此对象是不可用的,将要被回收. 商业虚 ...

  6. 红豆带你从零学C#系列之:开始C#编程(一)

    让我们开始学习C#编程吧 作者:红豆西米露 交流QQ:937802080 前面的文章里给大家介绍了C#语言的一些基本认识,现在我们来开始做一个小程序吧! 在这里以我们以“控制台应用程序”来作演示. P ...

  7. Qt(QML)本地化

    Internationalization and Localization with Qt Quick 程序国际化 1) Use qsTr() for all  Literial UI strings ...

  8. [Swust OJ 1139]--Coin-row problem

    题目链接:  http://acm.swust.edu.cn/contest/0226/problem/1139/ There is a row of n coins whose values are ...

  9. R与数据分析旧笔记(十八完结) 因子分析

    因子分析 因子分析 降维的一种方法,是主成分分析的推广和发展 是用于分析隐藏在表面现象背后的因子作用的统计模型.试图用最少的个数的不可测的公共因子的线性函数与特殊因子之和来描述原来观测的每一分量 因子 ...

  10. 公选网站作业4_2.php

    序:   此实验的功能是只有已经登陆或者已经注册的用户才有发表留言的资格,否则只能够浏览留言. 1.  主要文件: 4_2login.html// 登陆的主页面 4_2login.php  //处理登 ...