查询 - 基于行的表

时间:2012-03-27 21:29:55

标签: c# sql database sybase

我无法控制数据在此表中的保存方式。但是,我必须查询表并将类似pn_id列的数据组合为一行/记录。

例如,当前的数据结构如下,

enter image description here

这里我们使用不同的问题ID重复相同的pn_id。根据我的观点,这本应该真的保存为一个pn_id,然后将每个问题保存为一个单独的列。但是,我必须将以下数据检索为这样的一条记录..

enter image description here

知道如何做到这一点?

谢谢

2 个答案:

答案 0 :(得分:2)

结构很好。每个问题都有一列是没有意义的,因为每次添加新问题时都必须添加一个新列。

PIVOT可以轻松解决您的问题。请查看this链接以获取解释

答案 1 :(得分:2)

这是变换算法的一些伪代码。请注意,它需要扫描整个数据集两次;还有一些提高效率的机会,例如,如果可以对输入数据进行排序。此外,由于它是伪代码,我没有添加空值处理。

var columnNames = new HashSet<string> { "pn_id" };

foreach (var record in data)
    columnNames.Add(record.question_id.ToString());

var table = new DataTable();
foreach (var name in columnNames)
    table.Columns.Add(new DataColumn(name, typeof(string)));

foreach (var record in data)
{
    var targetRecord = CreateNewOrGetExistingRecord(table, record.pn_id);
    targetRecord[record.question_id.ToString()] = record.char_value ?? record.date_value.ToString();
}

这是辅助方法的草图:

DataRow CreateNewOrGetExistingRecord(DataTable table, object primaryKeyValue)
{
    var result = table.Find(primaryKeyValue);
    if (result != null)
        return result;

    //add code here to create a new row, add it to the table, and return it to the caller
}