3

如何使用 C# 作为 SQL 中的 unpivot 将数据集列转换为行。我找到了一种将行转换为列的方法。C# 行到列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 应用程序中并没有旋转。

4

3 回答 3

3

用于取消透视数据表的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 回答
1

surfmuggle 的答案就是我所说的“转置”表格(切换列和行)。在 excel 中,当您透视数据时,您通过另一列(公寓/部门)的属性聚合(总和/分钟/平均/等)一列(在他的示例中为费用或销售额)的值。您可以按另一列(星期几)进一步细分费用。

因此,当我想“取消透视”数据时,我想回到那些看起来重复的原始数据,以便我可以以其他方式重新透视它,通常是先过滤它,这样我的列中就没有那么多列了新的透视表。

这就是我希望 surfmuggle 的数据变成的内容:

在此处输入图像描述

这是我的 C# 代码,用于将他的原始数据表转换为我想要的数据格式:

public static DataTable UnpivotDataTable(DataTable pivoted)
{
    string[] columnNames = pivoted.Columns.Cast<DataColumn>()
        .Select(x => x.ColumnName)
        .ToArray();

    var unpivoted = new DataTable("unpivot");
    unpivoted.Columns.Add(pivoted.Columns[0].ColumnName, pivoted.Columns[0].DataType);
    unpivoted.Columns.Add("Attribute", typeof(string));
    unpivoted.Columns.Add("Value", typeof(string));

    for (int r = 0; r < pivoted.Rows.Count; r++)
    {
        for (int c = 1; c < columnNames.Length; c++)
        {
            var value = pivoted.Rows[r][c]?.ToString();
            if (!string.IsNullOrWhiteSpace(value))
            {
                unpivoted.Rows.Add(pivoted.Rows[r][0], columnNames[c], value);
            }
        }
    }

    return unpivoted;
}
于 2018-05-03T14:42:54.623 回答
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 回答