c#中datatable行转列示例

每天进步多一点 每天进步多一点     2022-08-10     744

关键词:

 

 将下面表(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的表达式中,如果列名是中文,一定要为列名加上[],要不然会报错的,这也是我调试了好久才发现的。

 

pivot-行转列示例1

USE[ExampleDb]GO/******Object:Table[dbo].[SalesInfo1]ScriptDate:2017/12/1613:38:19******/SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGOCREATETABLE[dbo].[SalesInfo1]([Make][nvarchar](50)NOTNULLCONSTRAINT[DF 查看详情

pivot-行转列示例2

USE[ExampleDb]GO/******Object:Table[dbo].[PivotDemo1]ScriptDate:2017/12/1614:12:46******/SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGOCREATETABLE[dbo].[PivotDemo1]([Id][int]IDENTITY(1,1)NOTNULL,[Warehouse 查看详情

mysql---行转列(代码片段)

MySQL—行转列一、行转列1、SqlServer和Orcle中可以使用pivot行转列函数快速实现,而MySQL中没有pivot:SELECT*FROMstudentPIVOT(SUM(score)FORsubjectIN(语文,数学,英语))2、MySQL实现行转列SELECTname,MAX(CASEWHENsubject='语文'THENscoreEL 查看详情

c#datatable行转列并合并重复列。

datatable数据为这样名称开始时间A09:00:00A15:00:00B08:00:00B11:00:00B13:00:00C08:00:00想把datatable改成下面这样名称开始时间结束时间A09:00:0015:00:00B08:00:0013:00:00C08:00:00就是合并成一条,结束时间取相同名称的最大时间,,如果就一条的话。... 查看详情

填报需求:行转列填报表的制作

...格式去展现数据让用户修改:这种填报需求可以归纳为是行转列填报表的制作。实现原理填报制作需要符合来源、界面、去向严格对应原则,那么我们可以拆开来看:界面是行转列之后的效果,所以来源脚本里需要进行行转列处... 查看详情

数据行转列实例

??在系统开发中经常遇到进行数据的统计,并将数据行转列的情景。比如表中的表示。可是在数据库中呈现出来的数据往往是横行的样式。这就须要一个转换。转换的方式有两种方式。1.利用crossjoin去进行转换。2.利用casewhen函数... 查看详情

行转列-列转行_查询

开发过程中常遇到行转列或是列转行的问题,即需要将数据库中一张表信息进行行转列操作,再将每列(即每个字段)作为与其他表进行联表查询的字段进行显示。一、行转列:将原来同一列下多行的不同内容作为多个字段,输... 查看详情

mysql行转列-》动态行转列-》动态行转列带计算

PivotTableUsingMySQL-ACompleteGuide|WebDevZoomhttp://webdevzoom.com/pivot-table-using-mysql/Cross-Tabulation(PivotTables)withMySQL-CodeProjecthttps://www.codeproject.com/articles/363339/cross-tabulati 查看详情

行转列,列转行

 oracle: -----------------------------行转列 --------------------------------select*fromdemocreatetabledemo(idint,namevarchar(20),numsint); ----创建表insertintodemovalues(1,‘苹果‘,1000);in 查看详情

行转列(代码片段)

文章目录使用场景数据源行转列创建个月视图将个月视图拼接成完整月度数据视图将完整月度数据视图进行格式化图表展示效果计算月度平均值创建月度数据平均值视图图表展示效果使用场景  有时我们在进行图表数据统计时... 查看详情

sqlserver动态行转列(参数化表名分组列行转列字段字段值)

SQLServer动态行转列(参数化表名、分组列、行转列字段、字段值)2014-05-2616:09by听风吹雨, 26798 阅读, 50 评论, 收藏, 编辑一.本文所涉及的内容(Contents)本文所涉及的内容(Contents)背景(Contexts)实现代码... 查看详情

sqlsql语句实现行转列的3种方法(代码片段)

SQLsql语句实现行转列的3种方法系列文章目录文章目录SQLsql语句实现行转列的3种方法系列文章目录前言第一种方式:静态行转列第二种方式:用povit行转列第三种方式:用存储过程行转列前言将列值旋转为列名(即行转... 查看详情

hivesql行列转换(行转列,列转行)(代码片段)

在Hivesql应用中会遇到“行转列”和“列转行”的场景,下面介绍其基本使用语法。1.行转列:关键字:collect_set()/collect_list()、concat_ws()1)collect_set()/collect_list():collect_set()函数只接受基本数据类型,作用是... 查看详情

mysql行转列与列转行

参考技术A建表:新增数据:源数据:行转列后:建表:新增数据:源数据:列转行后: 查看详情

行转列

 select*fromResultselectTime日期,sum(case whenGrade=‘胜‘then1 else0 end)as胜,sum(case whenGrade=‘负‘then1 else0 end)as胜fromResultgroupbyTime 查看详情

通过sql实现动态行转列

上一章我们讲了固定行转列,本章我们就将一下怎么动态实现行转列的。因为有时候需要行专列的值有成千上万条,不可能再用固定行转列的方法,否则你一定会崩溃掉的。好了,废话不多说,开始吧!常见一张表tmp_test,内容如... 查看详情

sqlserver怎么行转列?

查询结果都是字符串类型的情况下,怎么行转列?如下图:1,首先创建数据表2,接着插入演示数据3,需要把学生的每门成绩集中到一行4,编写PIVOT函数实现5,运行以后实现行转列6,最后还可以用casewhen来实现参考技术A😱&... 查看详情

转换一个字段中含有多个另外一张表的id||行转列

1、OracleFunction --入参:表id/*  cxcyxm02:操作表,含有一个存储另一张表(xs0101)多个主键id的字段    ids:操作表的主键id*/CREATEORREPLACEFUNCTIONcxcyxmcyry(idsVARCHAR2)RETURNVARCHAR2IStempcyryxxVARCHAR2(10 查看详情