2017-06-20 31 views
-2

我有如下所示的Datatable;將列交換爲列

Systime  | Name | Value 
----------------------------- 
01.04.2017 Water  12 
01.04.2017 Bread  14 
01.04.2017 Chair  11 
02.04.2017 Water  25 
02.04.2017 Bread  16 
02.04.2017 Chair  21 

我想用下面的列交換行使用LINQ或等;

systime | Water | Bread | Chair 
------------------------------- 
01.04.2017  12  14  11 
02.04.2017  25  16  21 
+0

你已經嘗試 –

+0

@BRAHIMKamel的問題是我不知道的方式。搜索了很多,但沒有運氣。 –

+0

[如何在LINQ和SQL中將行轉換爲列]可能的副本(https://stackoverflow.com/questions/17971921/how-to-convert-row-to-column-in-linq-and-sql) – hardkoded

回答

2

這裏是你如何建立你的數據透視表

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      DataTable dt = new DataTable(); 
      dt.Columns.Add("Systime", typeof(DateTime)); 
      dt.Columns.Add("Name", typeof(string)); 
      dt.Columns.Add("Value", typeof(int)); 

      dt.Rows.Add(new object[] { DateTime.Parse("01/04/2017"),"Water", 12}); 
      dt.Rows.Add(new object[] { DateTime.Parse("01/04/2017"),"Bread", 14}); 
      dt.Rows.Add(new object[] { DateTime.Parse("01/04/2017"),"Chair", 11}); 
      dt.Rows.Add(new object[] { DateTime.Parse("02/04/2017"),"Water", 25}); 
      dt.Rows.Add(new object[] { DateTime.Parse("02/04/2017"),"Bread", 16}); 
      dt.Rows.Add(new object[] { DateTime.Parse("02/04/2017"),"Chair", 21}); 

      string[] items = dt.AsEnumerable().Select(x => x.Field<string>("Name")).Distinct().ToArray(); 

      DataTable pivot = new DataTable(); 
      pivot.Columns.Add("Systime", typeof(DateTime)); 
      foreach(string item in items) 
      { 
       pivot.Columns.Add(item, typeof(int)); 
      } 

      var groups = dt.AsEnumerable().GroupBy(x => x.Field<DateTime>("Systime")).ToList(); 

      int index = 0; 
      foreach (var group in groups) 
      { 

       DataRow newRow = pivot.Rows.Add(); 
       newRow[0] = group.Key; 
       foreach (string item in items) 
       { 
        newRow[item] = group.Where(x => x.Field<string>("Name") == item).Select(x => x.Field<int>("Value")).Sum(); 
       } 
      } 

     } 
    } 


} 
+0

謝謝。它效果很好。但是,systime如何不顯示在網格中,我看到int index = 0並從未使用過。爲什麼在那裏? –

+0

固定代碼。忘了那一步。 – jdweng