Объединение двух данных в один на основе столбца - PullRequest
0 голосов
/ 12 марта 2019

этот вопрос был задан, но у меня другой подход ссылка 1

У меня есть дата со следующими данными

 DataTable dtProduct = new DataTable();
            dtProduct.Columns.Add("productId");
            dtProduct.Columns.Add("name");

            DataRow dataRow = dtProduct.NewRow();
            dataRow["productId"] = 1;
            dataRow["name"] = "Burger";
            dtProduct.Rows.Add(dataRow);


            DataRow dataRow2 = dtProduct.NewRow();
            dataRow2["productId"] = 2;
            dataRow2["name"] = "Chicken";
            dtProduct.Rows.Add(dataRow2);

            DataTable dtSales = new DataTable();
            dtSales.Columns.Add("productId");
            dtSales.Columns.Add("saleId");
            dtSales.Columns.Add("month");
            dtSales.Columns.Add("quantity");

            DataRow dataSalesRow = dtSales.NewRow();
            dataSalesRow["productId"] = 1;
            dataSalesRow["saleId"] = "1";
            dataSalesRow["month"] = "Jan";
            dataSalesRow["quantity"] = 3433;
            dtSales.Rows.Add(dataSalesRow);


            DataRow drSales2 = dtSales.NewRow();
            drSales2["productId"] = 1;
            drSales2["saleId"] = "2";
            drSales2["month"] = "Feb"; 
            drSales2["quantity"] = 56; 
            dtSales.Rows.Add(drSales2);

            DataRow drSales3 = dtSales.NewRow();
            drSales3["productId"] = 1;
            drSales3["saleId"] = "3";
            drSales3["month"] = "Mar";
            drSales3["quantity"] = 34522;
            dtSales.Rows.Add(drSales3);


            DataRow drSales4 = dtSales.NewRow();
            drSales4["productId"] = 2;
            drSales4["saleId"] = "4";
            drSales4["month"] = "Feb";
            drSales4["quantity"] = 345;
            dtSales.Rows.Add(drSales4);

И еще один образец 2

 DataTable dtStudents = new DataTable();
            dtStudents.Columns.Add("studentId");
            dtStudents.Columns.Add("fullname");

            DataRow drStudentrow = dtStudents.NewRow();
            drStudentrow["studentId"] = 1;
            drStudentrow["fullname"] = "Bil";
            dtStudents.Rows.Add(drStudentrow);

            DataRow drStudentrow2 = dtStudents.NewRow();
            drStudentrow2["studentId"] = 2;
            drStudentrow2["fullname"] = "Paul";
            dtStudents.Rows.Add(drStudentrow2);


            DataTable dtStudentExam = new DataTable();
            dtStudentExam.Columns.Add("studentId");
            dtStudentExam.Columns.Add("subjectId");
            dtStudentExam.Columns.Add("mark");

            DataRow dataStudentExamRow = dtStudentExam.NewRow();
            dataStudentExamRow["studentId"] = 1;
            dataStudentExamRow["subjectId"] = "E123";
            dataStudentExamRow["mark"] = 34;
            dtStudentExam.Rows.Add(dataStudentExamRow);

            DataRow dataStudentExamRow2 = dtStudentExam.NewRow();
            dataStudentExamRow2["studentId"] = 2;
            dataStudentExamRow2["subjectId"] = "E123";
            dataStudentExamRow2["mark"] = 90;
            dtStudentExam.Rows.Add(dataStudentExamRow2);

            DataRow dataStudentExamRow3 = dtStudentExam.NewRow();
            dataStudentExamRow3["studentId"] = 1;
            dataStudentExamRow3["subjectId"] = "E155";
            dataStudentExamRow3["mark"] = 78;
            dtStudentExam.Rows.Add(dataStudentExamRow3);

            DataRow dataStudentExamRow4 = dtStudentExam.NewRow();
            dataStudentExamRow4["studentId"] = 1;
            dataStudentExamRow4["subjectId"] = "E101";
            dataStudentExamRow4["mark"] = 12;
            dtStudentExam.Rows.Add(dataStudentExamRow4);

            DataRow dataStudentExamRow5 = dtStudentExam.NewRow();
            dataStudentExamRow5["studentId"] = 1;
            dataStudentExamRow5["subjectId"] = "E234";
            dataStudentExamRow5["mark"] = 42;
            dtStudentExam.Rows.Add(dataStudentExamRow5);

DataTable products ( dtProduct ) имеет идентификатор продукта, который является ключом, а другая таблица данных sales ( dtSales ) имеет продажи для продукта на основе месяца. и имеет столбец productId.

что я хочу достичь, это объединить эти две таблицы с этим enter image description here

То же самое относится к студентам

У меня есть таблица данных студента ( dtStudents ), но, тем не менее, у меня есть таблицы данных оценок студенческого экзамена ( dtStudentExam ) по каждому предмету

и объединить что-то вроде этого enter image description here

Так что мой вопрос, могу ли я сделать это динамически. Я попробовал следующее ниже

public static System.Data.DataTable MergeRowsToColumns(DataTable rowDataTable, string rowDataTableIdColumnName, string friendlyName, DataTable columData)
        {
            List<string> columnsToAdd = new List<string>();
            if (rowDataTable == null)
            {
                return null;
            }
            DataTable finalDataTable = new DataTable();
            finalDataTable.Columns.Add(friendlyName.ToLower());
            finalDataTable.Columns.Add(rowDataTableIdColumnName.ToLower());

            foreach (DataColumn column in columData.Columns)
            {
                if (column.ColumnName.ToString() == rowDataTableIdColumnName.ToString())
                {
                    continue;
                }
                else
                {
                    finalDataTable.Columns.Add(column.ColumnName.ToString());
                    columnsToAdd.Add(column.ColumnName.ToString());
                }
            }

            foreach (DataRow row in rowDataTable.Rows)
            {
                DataRow newRow = finalDataTable.NewRow();
                newRow[rowDataTableIdColumnName] = row[rowDataTableIdColumnName];
                newRow[friendlyName] = row[friendlyName];
                foreach (DataRow columnRows in columData.Rows)
                {

                    foreach (string column in columnsToAdd)
                    {
                        var value = columnRows[column].ToString();
                        newRow[column] = value; 
                    }
                }
                finalDataTable.Rows.Add(newRow);
            }
            return finalDataTable;
        }

Алгоритм логики Таблица 1 содержит ключевую информацию Таблица 2 содержит данные значения для таблицы

с использованием имени столбца из таблицы один для идентификатора, который будет одинаковым для таблицы 2

могу ли я сделать это в общем в одной функции, как

var dtMergedProducts = HelperDataTable.MergeRowsToColumns(dtProduct, "productId", "name", dtSales);
        var dtStudents = HelperDataTable.MergeRowsToColumns(dtStudents, "studentId", "fullname", dtStudentExam); 

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

Большая часть загружаемых данных - не более 100 000

это ссылка на вспомогательную утилиту, которую я создаю git hub

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

DataTable 2 будет иметь значение столбца один для столбца и другой для значения Например dtSales

1- месяц: показано вертикально

2- количество: будет значение ячейки

Образец 2

dtStudentExam

1 - subjectId: отображается вертикально

2- оценка: будет оценка студента

1 Ответ

0 голосов
/ 13 марта 2019

Сегодня утром все заработало

здесь, если метод

public static System.Data.DataTable MergeRowsToColumns(DataTable rowDataTable, string rowDataTableIdColumnName, string friendlyName, DataTable dataAllValue , string dataColumnValue , string  dataColumnKey)
        {
            List<string> columnsToAdd = new List<string>();
            if (rowDataTable == null)
            {
                return null;
            }
            DataTable finalDataTable = new DataTable();
            finalDataTable.Columns.Add(friendlyName.ToLower());
            finalDataTable.Columns.Add(rowDataTableIdColumnName.ToLower());

            foreach (DataRow row in dataAllValue.Rows)
            {
                if (row[rowDataTableIdColumnName].ToString() == rowDataTableIdColumnName.ToString())
                {
                    continue;
                }
                else
                {
                    var isExistColumnValue = columnsToAdd.Where(c => c == row[dataColumnKey].ToString()).FirstOrDefault();
                    if(isExistColumnValue == null)
                    {
                        columnsToAdd.Add(row[dataColumnKey].ToString());
                        finalDataTable.Columns.Add(row[dataColumnKey].ToString());
                    }
                }
            }

            foreach (DataRow row in rowDataTable.Rows)
            {
                DataRow newRow = finalDataTable.NewRow();
                newRow[rowDataTableIdColumnName] = row[rowDataTableIdColumnName];
                newRow[friendlyName] = row[friendlyName];
                foreach (DataRow columnRows in dataAllValue.Rows)
                { 
                    if(row[rowDataTableIdColumnName].ToString() != columnRows[rowDataTableIdColumnName].ToString())
                    {
                        continue;
                    }
                    var columnName = columnRows[dataColumnKey].ToString();
                    var columnValue = columnRows[dataColumnValue].ToString();
                    newRow[columnName] = columnValue; 
                }
                finalDataTable.Rows.Add(newRow);
            }
            return finalDataTable;
        }

похоже, что я не смог добавить имена столбцов перед слиянием

Вы можете просто позвонить как

var dt = HelperDataTable.MergeRowsToColumns(dtProduct, "productId", "name", dtSales , "quantity", "month");
           var dt2 = HelperDataTable.MergeRowsToColumns(dtStudents, "studentId", "fullname", dtStudentExam , "mark", "subjectId"); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...