michael nabil Ответов: 2

Как вычислить третий столбец в этой таблице


у меня есть таблица в таком доступе


мне нужно вычислить третий столбец, чтобы быть таким
Column 1  Column 2
75        150
400       600
150       300
200       400
562.5     750
300       600
350       700


Column 1 Column 2 Column 3
75	 150	  0
400	 600   	  550
150	 300	  900
200	 400	  1250
562.5	 750	  2012.5
300	 600	  2500
350	 700	  3150


колонка 3 рассчитайте так
400+150=550
150+600+150=900
150+600+300+200=1250
150+600+300+400+562.5=2012.5

я надеюсь, что кто-то поможет мне решить эту проблему с помощью кода c# или запроса доступа
спасибо

Что я уже пробовал:

Я не могу понять, как решить эту проблему. Я хочу вычислить сумму из 2 ячеек



я попробовал этот код, чтобы сделать таблицу во время выполнения, но я использовал var sum1 для накопления столбца 1, но я не работал

DataTable workTable = new DataTable("Customers");
DataColumn workCol = workTable.Columns.Add("id", typeof(Int32));
workCol.AllowDBNull = true;
workCol.Unique = false;

DataRow workRow;
workTable.Columns.Add("Column 1", typeof(Double));
workTable.Columns.Add("Column 2", typeof(Double));
workRow = workTable.NewRow();

workRow[0] = Convert.ToInt32(dr[7].ToString());
workRow[1] = Convert.ToDouble(Column 1.ToString());
workRow[2] = Convert.ToDouble(Column 2.ToString());

workTable.Rows.Add(workRow);
int sum1 = 0;
int sum2 = 0;
foreach (DataRow dr1 in workRow.Table.Rows)
{

sum1 += Convert.ToInt32(dr1["Column 1"]);
sum2 += Convert.ToInt32(dr1["Column 2"]);

sum1.ToString();
sum2.ToString();
}

Richard MacCutchan

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

PIEBALDconsult

Я мог бы сделать это в SQL Server, но не уверен в доступе.
Одна вещь, которую следует иметь в виду о базах данных, заключается в том, что записи на самом деле не имеют врожденного порядка-вам нужно предоставить что-то, чтобы придать им порядок.

2 Ответов

Рейтинг:
2

Wendelius

Насколько я знаю, вы не можете использовать общее табличное выражение с доступом. Таким образом, единственным вариантом, по-видимому, является извлечение данных из базы данных на клиентскую сторону и выполнение вычислений там.

Одним из довольно простых способов было бы получить данные например:
- Извлечение данных в таблицу данных
- Упорядочивайте данные в соответствии с вашими требованиями, чтобы убедиться, что строки вычисляются в правильном порядке
- Во время каждой итерации используйте переменную для хранения суммы из предыдущих строк обновите целевой столбец на основе текущих данных и суммы из предыдущих строк

ДОПОЛНЕНИЕ:

Рассмотрим следующий пример для выполнения расчета итога

public static void RunningTotalExample() {
   System.Data.DataTable dataTable;
   System.Data.DataRow row;
   System.Data.DataView sortedView;
   int runningValue;

   // Cretae test table
   dataTable = new System.Data.DataTable("SampleTable");
   dataTable.Columns.Add("Ordinal", typeof(int));
   dataTable.Columns.Add("Amount", typeof(int));

   // Add some data in random order

   row = dataTable.NewRow();
   row["Ordinal"] = 2;
   row["Amount"] = 3;
   dataTable.Rows.Add(row);

   row = dataTable.NewRow();
   row["Ordinal"] = 1;
   row["Amount"] = 5;
   dataTable.Rows.Add(row);

   row = dataTable.NewRow();
   row["Ordinal"] = 3;
   row["Amount"] = 12;
   dataTable.Rows.Add(row);

   // Add a column for running total
   dataTable.Columns.Add("RunningTotal", typeof(int));

   // Sort the data and calculate the running total
   runningValue = 0;
   sortedView = new System.Data.DataView(dataTable);
   sortedView.Sort = "Ordinal ASC";
   foreach (System.Data.DataRowView singleRow in sortedView) {
      runningValue += (int)singleRow["Amount"];
      singleRow["RunningTotal"] = runningValue;
   }
   dataTable.AcceptChanges();

   // Print the values
   foreach (System.Data.DataRow singleRow in dataTable.Rows) {
      System.Diagnostics.Debug.WriteLine($"{singleRow["Ordinal"]} {singleRow["Amount"]} {singleRow["RunningTotal"]}");
   }
}

Выходные данные будут следующими (порядковый номер, сумма, текущий итог)
2 3 8
1 5 5
3 12 20


michael nabil

я попробовал этот код, чтобы сделать таблицу во время выполнения, но я использовал var sum1 для накопления столбца 1, но я не работал

DataTable workTable = новый DataTable("клиенты");
DataColumn workCol = рабочий стол.Столбцы.Add("id", typeof(Int32));
ворккол.AllowDBNull = true;
ворккол.Уникальный = ложь;

WorkRow объекта datarow ;
рабочий стол.Столбцы.Добавить("столбец 1", typeof(Double));
рабочий стол.Столбцы.Добавить("столбец 2", typeof(Double));
workRow = рабочий стол.Невров();

workRow[0] = конвертировать.ToInt32(dr[7].Метод toString());
workRow[1] = конвертировать.Метод Todouble(1 Колонка.Метод toString());
workRow[2] = конвертировать.ToDouble(Колонка 2.ToString());

workTable.Rows.Add(workRow);
int sum1 = 0;
int sum 2 = 0;
foreach (DataRow dr1 в workRow.Стол.Строки)
{

сумма 1 += конвертация.ToInt32(dr1["колонка 1"]);
сум2 += конвертировать.ToInt32(dr1["колонка 2"]);

sum1.Метод toString();
sum2.Метод toString();
}

Wendelius

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

Смотрите обновленный ответ.

michael nabil

я делаю этот код пытаясь сделать этот столбец 3 вычислить вот так
400+150=550
150+600+150=900
150+600+300+200=1250
150+600+300+400+562.5=2012.5
но я обнаружил, что мой код только суммирует столбец, что я не очень прост в excel sheet, но я не могу сделать это в grideview

Wendelius

Почему вы пытаетесь сделать расчет в gridview? Я бы предложил вам сделать расчет в datatable, как описано в Примере. В этом случае вид сетки показывает только результаты.

michael nabil

Я сделал как ты сказал спасибо

Wendelius

Рад, если это помогло!

Maciej Los

5ed!

Wendelius

Спасибо!

Рейтинг:
0

PIEBALDconsult

Вот как я бы сделал это с рекурсивным общим табличным выражением в SQL Server:

DROP TABLE #data 
;
CREATE TABLE #data 
( [ID]       INTEGER NULL 
, [Column 1] REAL    NULL
, [Column 2] REAL    NULL
)
;
INSERT INTO #data VALUES
  ( 1 , 75    , 150 )
, ( 2 , 400   , 600 )
, ( 3 , 150   , 300 )
, ( 4 , 200   , 400 )
, ( 5 , 562.5 , 750 )
, ( 6 , 300   , 600 )
, ( 7 , 350   , 700 )
;
WITH [work] AS
(
  SELECT * , CAST ( 0.0 AS REAL ) [Column 3] , [Column 2] [Sum 2] FROM [#data] WHERE [ID] = 1
UNION ALL
  SELECT A.[ID] , A.[Column 1] , A.[Column 2] , A.[Column 1] + B.[Sum 2] [Column 3] , A.[Column 2] + B.[Sum 2] [Sum 2]
  FROM [#data] A
  CROSS APPLY [work] B
  WHERE B.[ID] = A.[ID] - 1
)
SELECT [ID]
, [Column 1]
, [Column 2]
, [Column 3]
-- , [Sum 2]
FROM [work]


Но ты должен есть что-то, с помощью чего вы можете заказать записи.


michael nabil

спасибо за вашу помощь но
я использовал access 2007 и dotnet 2005
Я ценю твою идею

Maciej Los

5ed!