Транспонировать в Datatable в ASP.NET - PullRequest
0 голосов
/ 31 марта 2012

У меня есть DataTable с двумя столбцами как «ID», «Значение» с данными как:

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 ]

1 голос
/ 01 апреля 2012

Я достаточно хорошо знаком с данными PI OSI и сделал то же самое после загрузки данных тега 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 (вы можете называть их как хотите).

0 голосов
/ 17 июля 2012

Попробуйте эту функцию (то, что я недавно должен был сделать сам). Параметры:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...