Запрос - таблица на основе строк - PullRequest
1 голос
/ 28 марта 2012

У меня нет контроля над тем, как данные сохраняются в этой таблице.Однако я должен запросить таблицу и объединить данные для аналогичного столбца pn_id в одну строку / запись.

Например, текущая структура данных выглядит следующим образом:

enter image description here

Здесь мы повторяем один и тот же pn_id с разными идентификаторами вопросов.По моему мнению, это должно было быть действительно сохранено как один pn_id, а затем каждый вопрос как отдельный столбец.Тем не менее, я должен получить приведенные ниже данные в виде одной записи, подобной этой ..

enter image description here

Есть идеи, как это можно сделать?

Спасибо

Ответы [ 2 ]

2 голосов
/ 28 марта 2012

Вот некоторый псевдокод для алгоритма преобразования. Обратите внимание, что это требует сканирования всего набора данных дважды; Есть несколько других возможностей для повышения эффективности, например, если входные данные могут быть отсортированы. Кроме того, поскольку это псевдокод, я не добавил обработку для нулевых значений.

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
}
2 голосов
/ 28 марта 2012

структура в порядке. Не имеет смысла иметь один столбец на вопрос, потому что вам придется добавлять новый столбец каждый раз, когда добавляется новый вопрос.

Ваша проблема может быть легко решена с помощью PIVOT. Взгляните на эту ссылку для объяснения

...