C# DataTable 行转列通用方法

刺骨的言语ヽ痛彻心扉 2023-06-26 05:40 73阅读 0赞

废话不多说,直接上代码,别问我代码是谁,为什么要上它?(注意,转发或者引用我的代码的,请标明出处连接,否则菊花难保!)

下面举两个列子的数据,如下代码所示

  1. DataTable CreateDt1()
  2. {
  3. var dt = new DataTable();
  4. dt.Columns.Add("id");
  5. dt.Columns.Add("编号");
  6. dt.Columns.Add("姓名");
  7. dt.Columns.Add("类型");
  8. dt.Columns.Add("值");
  9. dt.Rows.Add(1,"0001","张三","身高","180");
  10. dt.Rows.Add(2,"0001","张三","体重","120");
  11. dt.Rows.Add(3,"0002","李四","身高","170");
  12. dt.Rows.Add(4,"0002","李四","体重","130");
  13. dt.Rows.Add(5,"0003","王五","身高","175");
  14. dt.Rows.Add(6,"0003","王五","体重","135");
  15. return dt;
  16. }
  17. DataTable CreateDt2(){
  18. var dt= new DataTable();
  19. dt.Columns.Add("户主编号");
  20. dt.Columns.Add("户主姓名");
  21. dt.Columns.Add("年月");
  22. dt.Columns.Add("费用类型");
  23. dt.Columns.Add("金额");
  24. dt.Rows.Add("0001","张三","2019-6","电费",100);
  25. dt.Rows.Add("0001","张三","2019-6","水费",90);
  26. dt.Rows.Add("0001","张三","2019-6","燃气费",200);
  27. dt.Rows.Add("0001","张三","2019-7","电费",110);
  28. dt.Rows.Add("0001","张三","2019-7","水费",100);
  29. dt.Rows.Add("0001","张三","2019-7","燃气费",190);
  30. dt.Rows.Add("0002","李四","2019-6","电费",125);
  31. dt.Rows.Add("0002","李四","2019-6","水费",100);
  32. dt.Rows.Add("0002","李四","2019-6","燃气费",110);
  33. dt.Rows.Add("0002","李四","2019-7","电费",120);
  34. dt.Rows.Add("0002","李四","2019-7","水费",60);
  35. dt.Rows.Add("0002","李四","2019-7","燃气费",150);
  36. return dt;
  37. }

数据1:































































Result Set (6 items)4
id 编号 姓名 类型
1 0001 张三 身高 180
2 0001 张三 体重 120
3 0002 李四 身高 170
4 0002 李四 体重 130
5 0003 王五 身高 175
6 0003 王五 体重 135

数据2:









































































































Result Set (12 items)4
户主编号 户主姓名 年月 费用类型 金额
0001 张三 2019-6 电费 100
0001 张三 2019-6 水费 90
0001 张三 2019-6 燃气费 200
0001 张三 2019-7 电费 110
0001 张三 2019-7 水费 100
0001 张三 2019-7 燃气费 190
0002 李四 2019-6 电费 125
0002 李四 2019-6 水费 100
0002 李四 2019-6 燃气费 110
0002 李四 2019-7 电费 120
0002 李四 2019-7 水费 60
0002 李四 2019-7 燃气费 150

行专列的通用方法:

  1. public static DataTable TableRowTurnToColumn(DataTable source, DataColumn[] groupColumns, DataColumn[] captionColumns, DataColumn valueColumn)
  2. {
  3. if (source == null)
  4. return null;
  5. DataTable dt = new DataTable();
  6. if (groupColumns != null)
  7. foreach (var item in groupColumns)
  8. {
  9. dt.Columns.Add(item.ColumnName, item.DataType);
  10. }
  11. foreach (var item in source.AsEnumerable().Select(p=>string.Join("_",captionColumns.Select(q=>p[q]))).Distinct())
  12. {
  13. if (!dt.Columns.Contains(item.ToString()))
  14. dt.Columns.Add(item.ToString());
  15. }
  16. var groupdata=source.AsEnumerable().GroupBy(p=>string.Join("",groupColumns.Select(q=>p[q])) ).ToList();
  17. var groupColNames=groupColumns.Select(p=>p.ColumnName);
  18. groupdata.ForEach(x=> {
  19. DataRow newRow = dt.NewRow();
  20. foreach (DataColumn col in dt.Columns)
  21. {
  22. if (groupColNames.Contains(col.ColumnName))
  23. {
  24. newRow[col.ColumnName] = x.FirstOrDefault()[col.ColumnName];
  25. }
  26. else
  27. {
  28. var data=x.Where(p=>string.Join("_",captionColumns.Select(q=>p[q]))==col.ColumnName);
  29. if(data.Count()>0){
  30. newRow[col.ColumnName]=data.Sum(p=>Convert.ToDecimal(p[valueColumn]));
  31. }
  32. }
  33. }
  34. dt.Rows.Add(newRow);
  35. });
  36. return dt;
  37. }

方法调用:

  1. var dt1=CreateDt1();
  2. var dt2=CreateDt2();
  3. var dt11=TableRowTurnToColumn(dt1,new DataColumn[]{dt1.Columns[1],dt1.Columns[2]},new DataColumn[]{dt1.Columns[3]},dt1.Columns[4]);
  4. var dt21=TableRowTurnToColumn(dt2,new DataColumn[]{dt2.Columns[0],dt2.Columns[1]},new DataColumn[]{dt2.Columns[2],dt2.Columns[3]},dt2.Columns[4]);

打印结果:

数据1行转列的结果:






































Result Set (3 items)4
编号 姓名 身高 体重
0001 张三 180 120
0002 李四 170 130
0003 王五 175 135

数据2行转列的结果:












































Result Set (2 items)4
户主编号 户主姓名 2019-6电费 2019-6水费 2019-6燃气费 2019-7电费 2019-7水费 2019-7燃气费
0001 张三 100 90 200 110 100 190
0002 李四 125 100 110 120 60 150

合在一起的直观结果:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIwOTc1OTA_size_16_color_FFFFFF_t_70

注:若要多个值,如下图的TeamQuantity 和FuelQuantity的两个值的,转成第三个表的结果,可以私聊。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIwOTc1OTA_size_16_color_FFFFFF_t_70 1

发表评论

表情:
评论列表 (有 0 条评论,73人围观)

还没有评论,来说两句吧...

相关阅读