将下面表(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. jQueryUI 日期控件

    <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Inse ...

  2. 滑动页面,顶部导航or顶部 固定在一个位置

    现在很多页面 特别是电商用的比较多 比如电商里面某个商品的详细页 往下拉页面 当滚轮到达一定位置的时候  导航栏即固定在顶部 其实他的原理很简单, 就是一开始设置导航为相对定位,然后计算出滚动条离顶部 ...

  3. Struts2 删除后直接直接到List显示页面

    package com.sun; import java.util.List; import java.util.Map; import org.hibernate.Session; import o ...

  4. windows7在局域网中无法映射驱动器问题解决

    昨天下班时闲的蛋疼,因电脑比较慢,因此在计算机的[系统配置中]的启动选项下对[启动项目]和[服务]做了误操作,导致在计算机重启之后声卡.显卡.网卡等许多服务禁用,更令人费解的是内网中断了连接,无法访问 ...

  5. 三、T4模板与实体生成

         上文我们最后虽然用模板创建了一个实体类,但是类的内容仍旧是静态的,这里我们需要用动态方式生成类的内容.因为需要查询数据库这里又免不了各种繁琐的连接数据库操作,为了使我们的编码更加直观,仍然采 ...

  6. 简单的js反选,全选,全不选

    <html> <head> <base href="<%=basePath%>"> <title>My JSP 'che ...

  7. 初涉JavaScript模式 (2) : 基本技巧

    尽量少用全局变量 大量使用全局变量会导致的后果 全局变量创建以后会在整个JavaScript应用和Web页面中共享.所有的全局变量都存在于一个全局命名空间内,很容易发生冲突 不知不觉创建了全局变量 其 ...

  8. JavaScript 学习-变量的作用域和块级作用域

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. c++内存管理错误记录

    extern "C" _CRTIMP int __cdecl _CrtIsValidHeapPointer( const void * pUserData ){ if (!pUse ...

  10. SQL语句宝典

    1.前述: 将数据灵活运用于手掌心! link:1.经典SQL语句大全(cnblogs) 2.SQL教程(W3C)