c# 行转列
将下面表(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# 行转列的更多相关文章
- SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL, ...
- T-SQL 实现行转列
问题: 我正在寻找一种有效的方式将行转换为SQL服务器中的列 例如,通过下表如何构建出预期结果表. Id Value ColumnName 1 John FirstName 2 2 ...
- Oracle行转列、列转行的Sql语句总结
多行转字符串 这个比较简单,用||或concat函数可以实现 SQL Code 12 select concat(id,username) str from app_userselect i ...
- sql的行转列(PIVOT)与列转行(UNPIVOT)
在做数据统计的时候,行转列,列转行是经常碰到的问题.case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比较快速实现行转列,列转行,而且可扩展性强 一.行转列 1.测 ...
- 做图表统计你需要掌握SQL Server 行转列和列转行
说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需要用到行转列和列转行. 1.列转行 数据经过计算加工后会直接生成 ...
- SQL SERVER特殊行转列案列一则
今天有个同事找我,他说他有个需求,需要进行行转列,但是又跟一般的行转列有些区别,具体需求如下所说,需要将表1的数据转换为表2的显示格式. 我想了一下,给出了一个解决方法,具体如下所示(先给出测试数据) ...
- SQL Server中使用PIVOT行转列
使用PIVOT行转列 1.建表及插入数据 USE [AdventureDB] GO /****** Object: Table [dbo].[Score] Script Date: 11/25/201 ...
- oracle行转列与列转行
一.行转列 在有些应用场景中,如学生成绩.学生所有科目的成绩都保存到一张表里面,当我们需要以列表的形式显示出学生所对应的每一科目的成绩的时候,需要使用到行转列. 示例 -- 学生成绩表 create ...
- Oracle行转列、列转行的Sql语句总结(转)
多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_userselect id||username str f ...
- ORACLE行转列通用过程
create or replace procedure row_to_col(tabname in varchar2, group_ ...
随机推荐
- MVC在母版页设置子页面的css和js引用布局
1.在母版页中指定子页面css和js布局 @RenderSection("Styles", false) @RenderSection("Scripts", f ...
- 微信小程序开发 [02] 页面注册和基本组件
1.页面注册 既然我们希望跳转到新的页面,那自然要新建页面相关的文件才行.在开篇已经讲过,一个小程序页面由四个文件组成,假如我们的页面名为welcome,那么这四个文件则是: welcome.js w ...
- Linux中一个网卡含有多个IP,将从IP升级为主IP的方法
今天在查看虚拟机的时候,发现某一网卡含有多个IP地址: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fas ...
- git reset之后找回本地未提交的代码
头脑发热使用了git reset命令回退到了之前的一个版本,结果把本地没有提交的代码给覆盖掉了..... 作为一个bug员自然是想恢复,毕竟重新写还得再测一遍,本着能懒一点是一点的原则,开始了恢复代码 ...
- 使用nginx很卡之strace命令
一.strace命令常用参数 strace -tt -T -v -f -e trace= -p -tt 在每行输出的前面,显示毫秒级别的时间 -T 显示每次系统调用所花费的时间 -v 对于某些相关调用 ...
- Linux常用rmp包网址
* HA:http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/ * Openstack:https://r ...
- 172. Remove Element【LintCode by java】
Description Given an array and a value, remove all occurrences of that value in place and return the ...
- 如何在 vCenter Server 上将虚拟机注册或添加到清单中
免责声明:本文为 Registering or adding a virtual machine to the Inventory in vCenter Server or in an ESX/E ...
- 【SE】Week1 : 个人博客作业
快速看完整部教材,列出你不懂的 5 - 10 个问题,发布在你的个人博客上. 1)针对书中提到的NABCD模型中的N,如何发掘市场不明确的潜在用户需求? 2)PM是否负责团队职责的分配以及工程模块的设 ...
- 2-Twelfth Scrum Meeting20151212
任务安排 成员 今日完成 明日任务 闫昊 获取视频播放的进度 获取视频播放进度 唐彬 解决handler可能引起的内存泄露问题 阅读IOS代码+阅读上届网络核心代码 史烨轩 下载service开发 ...