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(*) 等用法. ...
随机推荐
- 製程能力介紹(SPC introduction) ─ Cp之製程能力解釋
Cp之製程能力解釋 從常態分配的特性來看,在群體中 ±3σ(標準差) 之範圍內的值,應包含群體全部的 99.73%.也就是說,若以 6σ為單位,就可以代表整個分布的範圍,但是有 0.27% (2700 ...
- 将String类型的数字字符转换成int
java.lang.Integer.parseInt(String) public static int parseInt(String s) throws NumberFormatException ...
- 单页web应用开发流程
用循环的视角审视Web应用开发 框定一个一致的SPA图形用户界面(GUI)和模型 将SPA的原则带回服务器端 聚集于对合适的应用进行早期SPA开发[3] SPA协调的起点是认识到SPA与脚本和网页编 ...
- find the mincost route(最小环,最短路,floyd)
find the mincost route Time Limit: 1000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- lucene定义自己的分词器将其分成单个字符
问题描写叙述:将一句话拆分成单个字符.而且去掉空格. package com.mylucene; import java.io.IOException; import java.io.Reader; ...
- win8.1 安装webaccess遇到的写访问权限错误
大学的时候闲暇时间都用来玩游戏了,现在工作了,就把工作中遇到的问题和学习心得跟大家共享下,若有不对的地方欢迎指出,谢谢! 前几天突然想换用vs2013开发,就重装了win8.1系统,在新系统上安装we ...
- CSS蒙版
蒙版:就是在图片上添加一个图层,用于美化页面,增加页面的可读性 <!DOCTYPE html><html><head lang="en"> &l ...
- matlab GUI之常用对话框(一)-- uigetfile\ uiputfile \ uisetcolor \ uisetfont
常用对话框(一) 1.uigetfile 文件打开对话框 调用格式: [FileName,PathName,FilterIndex]=uigetfile or [FileName, ...
- nginx args
$args $content_length $content_type $document_root $document_uri $host $http_user_agent $http_cookie ...
- HDU4323-Magic Number(levenshtein distance-编辑距离)
描述: There are many magic numbers whose lengths are less than 10. Given some queries, each contains a ...