将下面表(1)格式的数据转换为表(2)格式的数据。很明显,这是一个行转列的要求,本想在数据库中行转列,因为在数据库中行转列是比较简单的,方法可以参考本站SQLServer中(行列转换)行转列及列转行且加平均值及汇总值,但因其它需求,最终需将该转化搬到C#中进行了。

(表1)

表(2)

不多说了,下面开始在DataTable行转列示例:

//DataTable行转列

private DataTable RCC(DataTable _outDataSource)

{

//从DataTable中读取不重复的日期行,用来构造新DataTable的列

DataTable distinct_date = _outDataSource.DefaultView.ToTable(true, "日期");

DataTable new_DataTable = new DataTable();

//将客户名称列添加到新表中

DataColumn new_d_col = new DataColumn();

new_d_col.ColumnName = "客户名称";

new_d_col.Caption = "";

new_DataTable.Columns.Add(new_d_col);

StringBuilder str_sum = new StringBuilder();

//开始在新表中构造日期列

foreach (DataRow dr in distinct_date.Rows)

{

new_d_col = new DataColumn();

new_d_col.DataType = typeof(decimal);

new_d_col.ColumnName = dr["日期"].ToString();

new_d_col.Caption = dr["日期"].ToString();

new_d_col.DefaultValue = 0;

new_DataTable.Columns.Add(new_d_col);

//这个的目的是为合计列构造expression

str_sum.Append("+[").Append("日期").Append("]");

}

//将合计列添加到新表中

new_d_col = new DataColumn();

new_d_col.DataType = typeof(decimal);

new_d_col.ColumnName = "Sum";

new_d_col.Caption = "合计";

new_d_col.DefaultValue = 0;

new_d_col.Expression = str_sum.ToString().substring(1);

new_DataTable.Columns.Add(new_d_col);

/*好了,到此新表已经构建完毕,下面开始为新表添加数据*/

//从原DataTable中读出不重复的客户名称,以客户名称为关键字来构造新表的行

DataTable distinct_object = _outDataSource.DefaultView.ToTable(true, "客户名称");

DataRow[] drs;

DataRow new_dr;

foreach (DataRow dr in distinct_object.Rows)

{

new_dr = new_DataTable.NewRow();

new_dr["客户名称"] = dr["客户名称"].ToString();

foreach (DataRow _dr in distinct_date.Rows)

{

drs = _outDataSource.Select("客户名称='" + dr["客户名称"].ToString() + "' and 日期='" + _dr["日期"].ToString() + "'");

if (drs.Length != 0)

{

new_dr[_dr["日期"].ToString()] = Math.Round(Convert.ToDecimal(drs[0]["金额"]), 2);

}

}

new_DataTable.Rows.Add(new_dr);

}

return new_DataTable;

}

从上面的代码中看到我们并没有为新表"合计"这一列赋值,这是因为该列具有表达式str_sum.Append("+[").Append("日期").Append("]"),所以这列的值是会自动填充的。

注意,在上面的表达式中,我们加了[],在DataTable的表达式中,如果列名是中文,一定要为列名加上[],要不然会报错的,这也是我调试了好久才发现的。

C#中DataTable行转列示例的更多相关文章

  1. sql中的行转列和列转行的问题

    sql中的行转列和列转行的问题 这是一个常见的问题,也是一个考的问题 1.行转列的问题  简单实例 CREATE TABLE #T ( MON1 INT, MON2 INT, MON3 INT ) G ...

  2. DataTable行转列

    /// <summary> /// DataTable行转列 /// </summary> /// <param name="dtable">需 ...

  3. c# DataTable行转列

    /// <summary> /// datatable行转列 /// </summary> /// <param name="dtSrc">来源 ...

  4. 微软BI 之SSIS 系列 - 在 SQL 和 SSIS 中实现行转列的 PIVOT 透视操作

    开篇介绍 记得笔者在 2006年左右刚开始学习 SQL Server 2000 的时候,遇到一个面试题就是行转列,列转行的操作,当时写了很长时间的 SQL 语句最终还是以失败而告终.后来即使能写出来, ...

  5. [google面试CTCI] 1-7.将矩阵中特定行、列置0

    [字符串与数组] Q:Write an algorithm such that if an element in an MxN matrix is 0, its entire row and colu ...

  6. Sqlserver中PIVOT行转列透视操作

    创建表: IF OBJECT_ID('T040_PRODUCT_SALES') IS NOT NULL DROP TABLE T040_PRODUCT_SALES create table T040_ ...

  7. mysql 中实现行变列

    前言: mysql行列变化,最难的就是将多个列变成多行,使用的比较多的是统计学中行变列,列变行,没有找到现成的函数或者语句,所以自己写了存储过程,使用动态sql来实现,应用业务场景,用户每个月都有使用 ...

  8. 游标、获取本地本地多个文件、Excel数据导入、跨服务器数据拷贝、行转列示例

    )='C:\Users\Administrator\Desktop\待处理数据\顺江学校4\' ---------------------------------------------------- ...

  9. 如何把excel中的行转为列?

    步骤:选择复制要转行的内容--->新建一张表格---->右键选择性粘贴---->转置----->成功把行转为列(具体操作看下图) 选择复制这些内容

随机推荐

  1. python面对对象编程----------7:callable(类调用)与context(上下文)

    一:callables callables使类实例能够像函数一样被调用 如果类需要一个函数型接口这时用callable,最好继承自abc.Callable,这样有些检查机制并且一看就知道此类的目的是c ...

  2. Eclipse4.4安装旧版本插件报错 Failed to prepare partial IU

    Failed to prepare partial IU: [R]com.googlecode.veloeclipse.ui 2.0.8. work around: go to Help -> ...

  3. Linux svn一次增加多个文件并批量上传

    命令行下操作svn没有使用界面形式的TortoiseSVN直观,但是不管怎样,命令行下操作svn还是有它的有点,如果你碰到一次需要svn add许多个文件怎么办?下面的命令可以帮助你解决这个问题 一次 ...

  4. NSlog警告—— 编译器打印NSInteger类型

    NSInter是apple推荐用的整形数据类型,在mac64位环境下用打印NSInteger的时候如果用%d,编译器会报警告: 对于32位代码,需要的%d说明符.但是,如果%d说明,得到的64位提示警 ...

  5. [转] UIImage 图像-IOS开发 (实例)

    转自  http://justcoding.iteye.com/blog/1470931 一 UIImageView 简介 UIImageView是显示图片的控件,显示图片时,首先需要把图片加载到UI ...

  6. Solution(项目部署):The server does not support version 3.0 of the J2EE Web module specification

    1.错误: 在eclipse中使用run->run on server的时候,选择tomcat6会报错误:The server does not support version 3.0 of t ...

  7. winform下调用webservice,传参List<string>

    用c#做了一个webservice,其中一个接口是public bool AddReturns(List<string> SQLStringList). 然后在另一个c#做的winform ...

  8. [javascript]事件冒泡处理

    <!DOCTYPE html> <html> <head> <style type="text/css"> #box1 { widt ...

  9. 小tip:我是如何初体验uglifyjs压缩JS的

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=2946 一.故事总有其 ...

  10. mysql存储过程的权限 definer

    mysql中用户对存储过程的权限有: ALTER ROUTINE 编辑或删除存储过程 CREATE ROUTINE 创建存储过程 EXECUTE运行存储过程 存储过程的创建者拥有存储过程的ALTER. ...