c# - 使用 C# 逆透视数据集

标签 c# asp.net dataset unpivot

如何使用 C# 作为 SQL 中的逆透视将数据集列转换为行。我找到了一种将行转换为列的方法。 C# Rows to Columns .将 DataTable 列转换为行有什么想法吗?谢谢..

下面提到的 Ivan 的代码

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");
            }                  
        }

它在控制台中运行良好。但是在我的 Web 应用程序中,这些行并不是不可透视的。

最佳答案

Linqpad转置(反旋转)DataTable 的演示

据我了解,您希望将行放入列中。下面的示例适用于 3 行(标题 + 2 数据行)。

DataTable transposed

如果你有更多行,你必须更改部分 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;
}

关于c# - 使用 C# 逆透视数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11292426/

相关文章:

xml - 使用嵌套表将数据集写入 xml

asp.net - 扩展 System.Web.HttpContext.User

c# - 在 RowUpdating (ASP.NET GridView) C# 期间获取 GridView 内标签的旧值

python - 构建 tensorflow 数据集迭代器,生成具有特殊结构的批处理

c# - Rethinkdb .net更新值

c# - 获取编译时间

c# - 连接状态已打开但无效?

c# - Visual Studio 向指定的命名空间添加前缀

ASP.net 发布和默认页面

c# - TableAdapter Fill 不更新数据库