ASP.NET中数据表的转置

ASP.NET中数据表的转置,asp.net,gridview,datatable,Asp.net,Gridview,Datatable,我有两列为“ID”的DataTable,数据为“Value”: 我想在GridView中将其显示为: A B C 100-100 1 200 -99 2 300 -98 3 400 -97 4 在DataTable中,哪种方法是最好的转置方式。如果有人能提供一个例子,那将非常有帮助 关于我非常熟悉OSI PI数据,在将PI标记数据拉入SQL Server数据库后,我也做了同样的工作 诀窍在于,需要有另一列具有开始时间或结束时间,以便可以匹配A、B和C的正确行 然后,只需使用PIVO

我有两列为“ID”的DataTable,数据为“Value”:

我想在GridView中将其显示为:


A   B   C
100-100 1
200 -99 2
300 -98 3
400 -97 4
在DataTable中,哪种方法是最好的转置方式。如果有人能提供一个例子,那将非常有帮助


关于

我非常熟悉OSI PI数据,在将PI标记数据拉入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
(你可以随意命名它们)。

试试这个函数(我最近不得不自己做)。参数为:

dtTableToTranspose=您要转置的表(显然)

索引=具有行键的列索引(在您的示例中为0)

private static DataTable transportseadonettatatable(DataTable dttablettotranspose,Int32索引)
{
DataTable dtTransposedTable=新数据表(“TransposedTable”);
字符串colName=dtTableToTranspose.Columns[index].ColumnName.ToString();
dtTransposedTable.Columns.Add(colName);
foreach(dtTableToTranspose.Rows中的DataRow行)
{
dtTransposedTable.Columns.Add(行[index].ToString());
}
Int32 colIndex=0;
foreach(dtTableToTranspose.Columns中的数据列dc)
{
如果(colIndex!=索引)
{
DataRow newRow=dtTransposedTable.newRow();
newRow[0]=dc.ColumnName;
对于(Int32 destColIndex=1;destColIndex
您是这样从数据库中获取的吗?如果你是,你可以使用这个是的,我从数据库得到这个,我不能改变。它的非关系数据库有三列“标记”、“值”和“时间”。它是OSI的产品,被称为“PI”数据库。谢谢,但我可以在C#中使用它,因为我没有使用链接服务器(SQL server)。我使用OLED直接获取PI归档文件。现在我想在GridView上显示上面的结果。啊,我错过了你们直接通过OLEDB调用这个。在这种情况下,我认为您应该研究使用LINQ以类似的方式透视数据,类似于下面的答案:您还可以调整PI SQL以使用LEFT JOIN将a、B和C的每个表在相同的ts_开始/ts_结束值上连接在一起。这将为您提供一个结果集,其中包含每个标记值的列及其公共时间戳。
SELECT *
FROM (SELECT ts_start, ID, Value FROM DataTable) v
PIVOT( SUM(Value) FOR ID IN ([A],[B],[C]) ) AS pvt
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;
}