【问题标题】:Transpose in Datatable in ASP.NET在 ASP.NET 中的数据表中转置
【发布时间】:2012-03-31 19:07:44
【问题描述】:

我有两列作为“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 中转置它的最佳方法是什么。如果有人能提供一个例子,那将是非常有帮助的。

问候

【问题讨论】:

  • 您是这样从数据库中获取的吗?如果你是你可以使用这个msdn.microsoft.com/en-us/library/ms177410.aspx
  • 是的,我是从我无法更改的数据库中获取的。它的非关系型数据库具有三列“TAG”、“Value”和“Time”。它是 OSI 的产品,被称为“PI”数据库。

标签: asp.net gridview datatable


【解决方案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 也是如此(您可以随意命名它们)。

【讨论】:

  • 谢谢,但我可以在 C# 中使用它,因为我没有使用链接服务器(SQL Server)。我正在使用 OLED 直接获取 PI Archive vale。现在我想在 GridView 上显示上面的结果。
  • 啊,我错过了您直接通过 OLEDB 调用它。在这种情况下,我认为您应该考虑使用 LINQ 以类似的方式对数据进行透视,类似于以下答案:stackoverflow.com/questions/167304/… 您还可以调整您的 PI SQL 以使用 LEFT JOIN 来连接 A、B 的每个表, 和 C 一起放在同一个 ts_start/ts_end 值上。这将为您提供单个结果集,其中包含每个标记值的列及其公共时间戳。
【解决方案2】:

试试这个功能(我最近不得不自己做的事情)。参数是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多