将下面表(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# 行转列的更多相关文章

  1. SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL, ...

  2. T-SQL 实现行转列

    问题: 我正在寻找一种有效的方式将行转换为SQL服务器中的列 例如,通过下表如何构建出预期结果表. Id  Value   ColumnName 1   John    FirstName 2   2 ...

  3. Oracle行转列、列转行的Sql语句总结

    多行转字符串 这个比较简单,用||或concat函数可以实现  SQL Code  12    select concat(id,username) str from app_userselect i ...

  4. sql的行转列(PIVOT)与列转行(UNPIVOT)

    在做数据统计的时候,行转列,列转行是经常碰到的问题.case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比较快速实现行转列,列转行,而且可扩展性强 一.行转列 1.测 ...

  5. 做图表统计你需要掌握SQL Server 行转列和列转行

    说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需要用到行转列和列转行. 1.列转行 数据经过计算加工后会直接生成 ...

  6. SQL SERVER特殊行转列案列一则

    今天有个同事找我,他说他有个需求,需要进行行转列,但是又跟一般的行转列有些区别,具体需求如下所说,需要将表1的数据转换为表2的显示格式. 我想了一下,给出了一个解决方法,具体如下所示(先给出测试数据) ...

  7. SQL Server中使用PIVOT行转列

    使用PIVOT行转列 1.建表及插入数据 USE [AdventureDB] GO /****** Object: Table [dbo].[Score] Script Date: 11/25/201 ...

  8. oracle行转列与列转行

    一.行转列 在有些应用场景中,如学生成绩.学生所有科目的成绩都保存到一张表里面,当我们需要以列表的形式显示出学生所对应的每一科目的成绩的时候,需要使用到行转列. 示例 -- 学生成绩表 create ...

  9. Oracle行转列、列转行的Sql语句总结(转)

    多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_userselect id||username str f ...

  10. ORACLE行转列通用过程

    create or replace procedure row_to_col(tabname in varchar2,                                   group_ ...

随机推荐

  1. Android Des加密解密

    算法转自:http://www.linuxidc.com/Linux/2011-08/41866.htm import java.security.Key; import java.security. ...

  2. PRML5-神经网络(2)

    本节来自<pattern recognition and machine learning>第5章. 接(PRML5-神经网络(1)) 5.5NN中的正则化 NN的输入层和输出层的单元个数 ...

  3. jquery 同步ajax

    有时,我们需要通过ajax远程获取数据后再绑定给其他应用,其他应用依赖于ajax返回结果.而ajax默认为异步,此时需要改为同步 var data = $.ajax({ url: "/Adm ...

  4. ajax入门简述

    ajax 全称为 “Asynchronous JavaScript and XML”(异步 JavaScript 和 XML),是一种创建交互式网页应用的网页开发技术,本质上是一个浏览器端的技术,就是 ...

  5. 20155308《网络对抗》Exp6 信息搜集与漏洞扫描

    20155308<网络对抗>Exp6 信息搜集与漏洞扫描 原理与实践说明 实践内容 本实践的目标是掌握信息搜集的最基础技能.具体有: 各种搜索技巧的应用 DNS IP注册信息的查询 基本的 ...

  6. Linux 平台和 Windows平台下 Unicode与UTF-8互转

    Windows: unsigned char * make_utf8_string(const wchar_t *unicode) { , index = , out_index = ; unsign ...

  7. 1、Docker概述与安装

    1.Docker概述 原文地址:https://docs.docker-cn.com/engine/docker-overview/#docker-engine Docker是一个开发,集装,运行应用 ...

  8. ubuntu set/unset proxy

    export http_proxy export https_proxy unset http_proxy unset https_proxy

  9. iOSApp上下有黑边

    如图: 这种情况就是没有启动页导致的,加了启动页图片之后就不会再出现了. 设置启动页的方法: http://www.cnblogs.com/BK-12345/p/5218229.html 有的人说我加 ...

  10. linux之 sed 基础

    转载:https://www.cnblogs.com/chensiqiqi/p/6382080.html sed 介绍 Sed命令是操作,过滤和转换文本内容的强大工具.常用功能有增删改查(增加,删除, ...