在ASP.NET中的数据表中进行转置

时间:2012-03-31 19:07:45

标签: asp.net gridview datatable

我有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中转置它的最佳方法。如果任何人都能提供一个例子,那将非常有用。

此致

2 个答案:

答案 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需要聚合,别名vpvt(您可以随意命名)。

答案 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;
}