如何使用 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 数据行)。
如果你有更多行,你必须更改部分 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/