Экспорт данных в Excel с зубчатыми столбцами из-за динамических данных? - PullRequest
0 голосов
/ 25 января 2010

У меня есть небольшая интересная проблема, когда мне нужно создать дамп данных Excel из некоторых данных в базе данных, но вместо того, чтобы быть чем-то простым, у меня есть некоторые сложные данные для объединения, ниже приведен пример данных Я должен иметь дело.

TblGeneralInfo

RecordId|Record Name  |Date      |Cost
1       |Test Entry  | 1/1/2010 |2.0
2       |Test Entry2 | 1/1/2010 |20.25

TblRandomInfo

RecordId |QuestionName   | Answer
1        |Your Name?     | Bob
1        |Your Title?    | The Builder
2        |Favorite Movie | The Matrix
2        |Favorite Car   | Mustang

В конце концов мне нужно следующее

RecordId|Record Name |Date      |Cost  |              |            |              |
1      |Test Entry  | 1/1/2010 |2.0   |Your Name?    | Bob        | Your Title?  | The Builder
2      |Test Entry2 | 1/1/2010 |20.25 |Favorite Move | The Matrix | Favorite Car | Mustang

Теперь я использую SQL Server 2005 для отчетов и ASP.NET 3.5 (C #) для приложения. Я ищу лучший способ сделать это. Количество элементов в «tblRandomInfo» является переменным и может содержать до 20-30 пар Q / A на запись. Я не могу легко сделать поворот, даже динамический поворот из-за характера данных.

Редактировать

Решение действительно на стороне SQL Server или C #. Но обратите внимание, что информация в tblRandomInfo может содержать разрывы строк.

Ответы [ 3 ]

2 голосов
/ 25 января 2010

Проблема в том, что вы пытаетесь создать запрос T-SQL, который сделает таблицу похожей на ваш желаемый результат?

Я уверен, что это можно сделать, но почему бы не создать вывод в приложении c #? Проще всего выписать csv.

  1. извлечение записей TblGeneralInfo
  2. извлечение записей TblRandomInfo
  3. для каждой записи в TblGeneralInfo записать RecordId, RecordName, Date и Cost
  4. для каждой записи в TblRandomInfo, которая имеет RecordId, соответствующий записи TbGeneralInfo, напишите QuestionName и Answer
  5. перевод строки

Конечно, вы можете сделать это и с помощью взаимодействия, если у вас установлен Excel на сервере, но это добавляет сложности с довольно небольшим преимуществом по сравнению с CSV.

0 голосов
/ 25 января 2010

Я согласен с Джеем ... Двойной foreach в коде дает вам максимальный контроль и его не так сложно достичь.

Но вы сказали, что данные были неровными, поэтому я должен предположить, что таблица «случайной информации» не содержит полностью предсказуемый набор строк для каждого пользователя. Это не совсем чистый «стержень», поэтому делать это в TSQL было бы излишне сложно и, вероятно, хрупко, если данные не всегда чисты.

Вот пример использования Linq to SQL (не проверяется на синтаксис или что-либо еще, так что это может быть немного грубым примером). Предполагается, что у вас есть контекст данных с именем "ctx".

var someDate = DateTime.Now.AddMonths(-1);
var genInfo = ctx.TblGeneralInfos.Where(g => g.Date > someDate);

//old-fashioned datatable seems to fit our needs well for storing the output data.
var scratchTable = new DataTable();
scratchTable.Columns.Add("RecordId");//repeat for any other fields in General Info we need to output

//do one pass through data get the field names from random info and add each possibly column to scratch table
foreach (var g in genInfo)
{                
    foreach(var r in g.TblRandomInfos)
    {
        if(scratchTable.Columns.Contains(r.QuestionName)
        {
            scratchTable.Columns.Add(r.QuestionName);
        }
    }
}

//now that scratch table has every column we could need, read and populate from data
foreach (var g in genInfo)
{       
    var row = scratchTable.NewRow();
    row["RecordId"] = g.RecordId.ToString();
    foreach(var r in g.TblRandomInfos)
    {
        row[r.QuestionName] = r.Answer;
    }
    scratchTable.Rows.Add(row);// put row in scratch table
}

//Now all you have to do is convert datatable to csv... this is well documented online
//  http://www.dotnetspark.com/kb/436-convert-datatable-to-csv-file-using-c-sharp.aspx
0 голосов
/ 25 января 2010

Я бы, наверное, так об этом сказал: Добавьте в список три поля, соответствующие идентификатору в TblGeneralInfo, затем добавьте поля для каждого соответствующего идентификатора в TblRandomInfo в этот список. Добавьте каждое значение в этом списке в строку в вашей электронной таблице, промойте и повторите для каждого уникального идентификатора. Вы даже можете найти библиотеку, которая делает это возможным здесь: http://www.codeproject.com/KB/office/excelxmllibrary.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...