我有DataTable,其中两列为“ID”,“Value”,数据为:
ID Value
A 100
A 200
A 300
A 400
A 500
B -100
B -99
B -98
B -97
C 1
C 2
C 3
C 4
我想在GridView中将其显示为:
A B C
100-100 1
200 -99 2
300 -98 3
400 -97 4
这是在DataTable中转置它的最佳方法。如果任何人都能提供一个例子,那将非常有用。
此致
答案 0 :(得分:1)
我对OSI PI数据非常熟悉,在将PI tag数据提取到SQL Server数据库后,我也做了同样的事情。
诀窍是需要有一个具有开始时间或结束时间的列,因此可以匹配A,B和C的正确行。
然后,只需使用PIVOT(仅限SQL Server 2005+)对它们进行分组:
SELECT *
FROM (SELECT ts_start, ID, Value FROM DataTable) v
PIVOT( SUM(Value) FOR ID IN ([A],[B],[C]) ) AS pvt
您可以使用上面所需的任何聚合(MAX,MIN,SUM等),只要每个标记和时间戳的不同组合只有一个值就没关系。 PIVOT需要聚合,别名v
和pvt
(您可以随意命名)。
答案 1 :(得分:0)
尝试这个功能(我最近不得不做的事情)。参数是:
dtTableToTranspose =要转置的表格(显然)
index =具有行键的列索引(在您的情况下,它将为0)
private static DataTable TransposeADONETDataTable(DataTable dtTableToTranspose, Int32 index)
{
DataTable dtTransposedTable = new DataTable("TransposedTable");
String colName = dtTableToTranspose.Columns[index].ColumnName.ToString();
dtTransposedTable.Columns.Add(colName);
foreach (DataRow row in dtTableToTranspose.Rows)
{
dtTransposedTable.Columns.Add(row[index].ToString());
}
Int32 colIndex = 0;
foreach (DataColumn dc in dtTableToTranspose.Columns)
{
if (colIndex != index)
{
DataRow newRow = dtTransposedTable.NewRow();
newRow[0] = dc.ColumnName;
for (Int32 destColIndex = 1; destColIndex < dtTransposedTable.Columns.Count; destColIndex++)
{
newRow[destColIndex] = dtTableToTranspose.Rows[destColIndex - 1][colIndex];
}
dtTransposedTable.Rows.Add(newRow);
}
colIndex++;
}
return dtTransposedTable;
}