3

How to convert dataset columns into rows using C# as unpivot in SQL. I found a method to convert rows to columns . C# Rows to Columns . Any ideas to convert DataTable columns to rows ?? Thanks ..

My code as Ivan mentioned below

OracleDatabase database = null;               
DbCommand command = null;
 protected void Button1_Click(object sender, EventArgs e)
        {
            database = new OracleDatabase("Connection String");
            command = database.GetSqlStringCommand("select avg(PRMTN_PRDCT_GROUP_SK),avg(STORE_CLSTR_SK) from ALG_AVERAGE_BASELINE_SALE");
            DataSet ds = new DataSet();
            ds = database.ExecuteDataSet(command);               
            DataTable dt = new DataTable();
            dt = ds.Tables[0];
            dt.Columns.AddRange(new DataColumn[] { 
               new DataColumn("col1"), 
               new DataColumn("col2") });
            foreach (DataRow row in dt.Rows)
            {
                foreach (var column in row.ItemArray)
                    Response.Write(column);                    
            }
            Response.Write("\n");
            var result = dt.Columns
                          .Cast<DataColumn>()
                          .Select(column =>
                             dt.AsEnumerable()
                               .Select(row =>
                                  row.ItemArray[column.Ordinal].ToString()));
            Response.Write("\n");
            foreach (var row in result)
            {
                foreach (var column in row)
                    Response.Write(column);
                Response.Write("\n");
            }                  
        }

It works fine in console. But the rows are not unpivoted in my web application..

4

3 に答える 3

3

DataTable のピボットを解除するためのLinqpadデモ

私が理解している限り、行を列に入れたいと思っています。以下のサンプルは、3 行 (ヘッダー + 2 データ行) で機能します。

データテーブルのピボットを解除

それ以上の行がdt2.Rows.Add(columnNames[i], dt.Rows[0].ItemArray[i],dt.Rows[1].ItemArray[i]);ある場合は、行の数に一致するようにパーツを変更する必要があります。多くの行の場合、このソウルションを改善する必要があります。

void Main() {
    var dt = GetDataTable("Sales");
    dt.Dump();
    UnpivotDataTable(dt).Dump();
}

public DataTable GetDataTable(string name) {
    var dt = new DataTable(name);   
    dt.Columns.Add("Id", typeof(string)); // dt.Columns.Add("Id", typeof(int)); 
    dt.Columns.Add("Apartement", typeof(string));   
    dt.Columns.Add("Monday", typeof(int));
    dt.Columns.Add("Tuesday", typeof(int));
    dt.Columns.Add("Wednesday", typeof(int));
    dt.Columns.Add("Thursday", typeof(int));
    dt.Columns.Add("Friday", typeof(int));      
    dt.Rows.Add(1, "Food", 300, 270, 310, 280, 500);
    dt.Rows.Add(2, "Electronics", 600, 470, 410, 380, 1500);    
    return dt;
}

public DataTable UnpivotDataTable(DataTable dt){
    string[] columnNames = dt.Columns.Cast<DataColumn>().Select(x => x.ColumnName).ToArray();           
    var dt2 = new DataTable("unpivot"); 
    dt2.Columns.Add("Headers", typeof(string)); 
    for(int rowIndex = 0; rowIndex < dt.Rows.Count; rowIndex++){
        dt2.Columns.Add("Row" + rowIndex.ToString(), typeof(string)); 
    }
    
    for(int i=0; i < columnNames.Length; i++){
        // flaw: hardcoded is the amount of rows that are unpivoted
        dt2.Rows.Add(columnNames[i], dt.Rows[0].ItemArray[i],dt.Rows[1].ItemArray[i]);
    }
    return dt2;
}
于 2013-02-16T21:53:25.850 に答える
0

次のコードを試してデータテーブルを作成し、データを入力してください。

  public DataTable getdatw()
{

    DataTable dtExcel = new DataTable();
    dtExcel.Columns.Add("Id", typeof(Int32));
    dtExcel.Columns.Add("Name", typeof(String));
    DataRow row;
    row = dtExcel.NewRow();
    row["Id"] = "1";
    row["Name"] = "kamal";
    dtExcel.Rows.Add(row);
    return dtExcel;
}

さらに、データは、配列、コレクションなどから入力するなど、要件に応じてさまざまな方法で入力できます。

于 2012-07-02T12:10:23.763 に答える