2015-05-21 64 views
0

這是我的表,我從數據庫中獲取:行到列轉置。與唱片發行

**Month  PCode   Sales** 
January  001   2 
January  002   1 
January  003   5 
February  001   6 
February  002   4 
February  003   2 
March   001   8 
March   002   10 
March   003   7 

結果,我想:

**Month   001  002  003** 
January   2   1  5  
February   6   4  2 
March    8  10  7 

我做了這麼遠:

private void TransposeTable(DataTable inputTable) 
{ 
    DataTable outputTable = new DataTable(); 

    outputTable.Columns.Add(inputTable.Columns[0].ColumnName.ToString()); 

    List<string> l_month = new List<string>(); 

    foreach (DataRow inRow in inputTable.Rows) 
    { 
     if (!l_month.Contains(inRow[1].ToString())) //if PCode not found 
     { 
      l_month.Add(inRow[1].ToString()); 
      outputTable.Columns.Add(inRow[1].ToString());//PCode as column header 
     } 
    } 
} 

我已經創建表列通過使用上面的代碼,現在我有問題如何轉置銷售

回答

1

如果你想創建一個新的「支點」 DataTable,具有獨特的PCode值的列,你將需要做的是在以下幾個步驟:

private DataTable TransposeTable(DataTable inputTable) 
{ 
    // create output pivot table and add the "Month" column to it. 
    var pivotTable = new DataTable("PivotTable"); 
    var srcMonthCol = inputTable.Columns["Month"]; 
    var salesDataType = inputTable.Columns["Sales"].DataType; 
    pivotTable.Columns.Add(new DataColumn(srcMonthCol.ColumnName, srcMonthCol.DataType)); 

    // get unique 'PCode' values 
    var uniquePeriods = inputTable.AsEnumerable() 
     .Select(x => x.Field<string>("PCode")) 
     .Distinct() 
     .ToList(); 

    // Add the unique 'PCode' as columns to the pivot table 
    uniquePeriods.ForEach(p => pivotTable.Columns.Add(new DataColumn(p, salesDataType))); 

    // Now we have the columns for the pivot table set-up and we need 
    // to get the rows, which will be grouped by month. 
    var rows = inputTable.AsEnumerable() 
     .GroupBy(x => x.Field<string>("Month")) 
     .Select(x => { 
      var mc = new object[] { x.Key, }; 
      var salesCols = uniquePeriods 
       .Select(p => x 
        .Where(r => r.Field<string>("PCode") == p) 
        .Select(r => r["Sales"]) 
        .FirstOrDefault()); 
      return mc.Concat(salesCols).ToArray(); 
     }).ToList(); 

    // Now we can add the rows. 
    rows.ForEach(r => pivotTable.Rows.Add(r)); 

    // And return the result. 
    return pivotTable; 
} 

注意

  • 如果您使用inputTable的唯一原因是作爲構建數據透視表的中介,那麼直接查詢數據庫以獲取創建數據透視表所需的信息可能更有效。
  • 如果每個期間/每月可能有多個銷售條目,則此功能無法按預期工作,並且需要沿這些軸之一彙總銷售值。
0

您可以合計數據表中的記錄,並建立從C#提供免費NReco.PivotData library透視表報表:在這一步,你會在內存中獲取多維數據集

DataTable inputTable; // your input data 
var pivotData = new PivotData(
    new string[] {"Month","PCode"}, 
    new SumAggregatorFactory("Sales"), 
    new DataTableReader(inputTable)); 

(值可以通過索引來訪問)。 下一步越來越透視表與數據透視表類:

var pvtTbl = new PivotTable(
    new[] {"Month"}, // dimension(s) used for rows 
    new [] {"PCode"}, // dimension(s) used for columns 
    pivotData); 

後,您可以使用pvtTbl產生透視表報表簡單地通過列(PivotTable.ColumnKeys,迭代PivotTable.RowsKeys +度日像pvtTbl[0,0]行/列索引的單元格的值)和行(您可以下載在PivotData庫官方頁面上生成HTML數據透視表的MVC示例)。

我是該圖書館的作者;隨時問我是否有任何使用它的複雜性。

+0

我相信你忘了在你的回答中透露你是你在回答中推薦的圖書館的所有者和作者。 – Alex

+0

你的大部分答案(我檢查過的最後13個答案中的12個)涉及與你有關聯的第三方圖書館,並且你沒有在答案中透露你的聯繫。請參閱[如何不成爲垃圾郵件發送者](http://stackoverflow.com/help/promotion):**您*必須*在您的答案中公開您的聯繫人**並編輯您的答案以包括與推薦的庫。 – Alex

+0

亞歷克斯,謝謝你注意到這一點(我已經添加了一個通知,我是這個庫的作者。希望這不是一個問題,因爲庫免費使用,我相信它可能對尋找在C#中構建數據透視表的簡單解決方案。 –