如何在SQL中使用C#作为取消透视将数据集列转换为行。我找到了一种将行转换为列的方法。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应用程序中,行并没有被取消透视。
发布于 2013-02-17 05:53:26
取消旋转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;
}
发布于 2018-05-03 22:42:55
surfmuggle的答案是我所说的“转置”表(交换列和行)。在excel中,当您透视数据时,通过另一列(公寓/部门)的属性聚合(sum/min/avg/etc)一列的值(在他的示例中为费用或销售额)。您可以按另一列(星期几)进一步细分费用。
因此,当我想要“取消透视”数据时,我希望返回到看起来重复的原始数据,这样我就可以用其他方式重新透视它,通常是先过滤它,这样我的新透视表中就不会有这么多列。
这就是我想要将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;
}
发布于 2012-07-02 20:10:24
尝试使用以下代码创建一个datatable,然后在其中填充数据。
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;
}
还有一件事,数据可以用多种方式填充,这取决于我们的需求,例如,你想要从数组,集合等填充。
https://stackoverflow.com/questions/11292426
复制相似问题