Синтаксическая ошибка в агрегированном аргументе: ожидается аргумент в виде одного столбца с возможным квалификатором ‘Child’

#c#

#c#

Вопрос:

 DataTable distinctTable = dTable.DefaultView.ToTable(true,"ITEM_NO","ITEM_STOCK");
DataTable dtSummerized = new DataTable("SummerizedResult");

dtSummerized.Columns.Add("ITEM_NO",typeof(string));
dtSummerized.Columns.Add("ITEM_STOCK",typeof(double));

int count=0;

foreach(DataRow dRow in distinctTable.Rows)
{
  count  ;
  //string itemNo = Convert.ToString(dRow[0]);
  double TotalItem = Convert.ToDouble(dRow[1]);

  string TotalStock = dTable.Compute("sum("   TotalItem   ")", "ITEM_NO="   dRow["ITEM_NO"].ToString()).ToString();
  dtSummerized.Rows.Add(count,dRow["ITEM_NO"],TotalStock);
}
  

Сообщение об ошибке: Синтаксическая ошибка в аргументе aggregate: ожидается аргумент в одном столбце с возможным квалификатором ‘Child’.

Кто-нибудь может мне помочь?

Спасибо.

Комментарии:

1. Ошибка в цикле foreach @string TotalStock = Convert. toString(dTable. Вычислить(«sum(» TotalItem «)», «ITEM_NO=» Преобразовать. toString(dRow[«ITEM_NO»])));

Ответ №1:

Вы могли бы попробовать это:

 dTable.Compute("sum(["   TotalItem   "])","");
  

Т.е. заключите имя вашего столбца в квадратные скобки [ ]

Идея взята из этого поста.

Ответ №2:

Проблема как раз в вашем типе данных столбца. Если у вас есть строка с динамически добавляемыми столбцами без подобного типа данных (это может быть результатом ручного вычисления или запроса с перекрестными табуляциями)

 myTable.Columns.Add("AddedColumn");
  

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

 myTable.Columns.Add("AddedColumn", typeof(System.Int32));
  

Я думаю, это сработает. Это то, с чем я сталкивался и исправлял раньше…

Ответ №3:

Вы хотите написать:

 dTable.Compute("sum(CONVERT(ITEM_STOCK, 'System.Double'))",
               "ITEM_NO='"   dRow["ITEM_NO"].ToString()   "'")
  

вместо:

 dTable.Compute("sum("   TotalItem   ")", "ITEM_NO="...
  

поскольку он будет преобразован в dTable.Compute("sum(value_of_TotalItem), "ITEM_NO="... , value_of_TotalItem является двойным и не является именем столбца.

Смотрите DataTable.Compute

Обновить:

попробуйте это:

 DataTable distinctTable = dTable.Clone();
dTable.Columns.Add("ITEM_STOCK_D", typeof(Decimal),
                   "CONVERT(ITEM_STOCK, 'System.Decimal')");
foreach (DataRow dRow in dTable.Rows)
{
    String itemNo = dRow["ITEM_NO"].ToString();
    if(distinctTable.Select(String.Format("ITEM_NO = '{0}'",itemNo)).Length == 0)
    {
        double totalStock = Convert.ToDouble(dTable.Compute("SUM(ITEM_STOCK_D)",
                                     String.Format("ITEM_NO = '{0}'", itemNo))); 
        distinctTable.Rows.Add(itemNo, totalStock.ToString());
    }
}
dTable.Columns.Remove("ITEM_STOCK_D");
  

Комментарии:

1. Привет, манджи — double TotalStock = (двойная)dTable. Вычислить(«sum(ITEM_STOCK)», «ITEM_NO =» dRow[«ITEM_NO»]. toString()); dtSummerized.Rows.Add(count, dRow[«ITEM_NO»],TotalStock);//Я получаю сообщение об ошибке из-за неправильного использования sum() и типа строки.

2. Тип столбца Item_NO такой string , что вы должны поместить его значение в простые кавычки: , "ITEM_NO='" dRow["ITEM_NO"].ToString() "'")

3. @manji — Извините, что беспокою вас, но это выдает мне ту же ошибку, недопустимое использование агрегатной функции Sum() и типа строки. Я пытался решить, но не смог разобраться. foreach(DataRow) dRow в distinctTable. Строки) { count ; double TotalStock = (двойная)dTable. Вычислить(«SUM(ITEM_STOCK)», «ITEM_NO='» dRow[«ITEM_NO»]. toString() «‘»); dtSummerized.Rows.Add(count,dRow[«ITEM_NO»],TotalStock); } можете ли вы помочь мне еще раз.

4. Хорошо, опубликованный вами код не очень понятен, я просматривал dtSummerized но на самом деле вы применяете sum к distinctTable , и я предполагаю, что ITEM_STOCK in distinctTable являются числами, но хранятся в столбце типа string . Если это так, замените sum(ITEM_STOCK) на sum(CONVERT(ITEM_STOCK, 'System.Double'))

5. Если это не работает, вы можете добавить новый вычисляемый столбец в distinctTable (перед циклом), содержащий преобразованные значения ITEM_STOCK : distinctTable.Columns.Add("ITEM_STOCK_D", typeof(Double), "Convert(ITEM_STOCK,'System.Double')") затем используйте этот новый столбец ...Compute("sum(ITEM_STOCK_D)...

Ответ №4:

В моем случае проблема была в самом моем запросе.

Мой запрос вернул разницу в двух столбцах. Например, query="Select A,B,A-B from Table" и я выполнял sum для datatable, используя функцию compute как dt.Compute("Sum(A-B)","") .

Итак, datatable не смог вычислить сумму A-B столбца. Я дал псевдоним столбца разницы как query="Select A,B,(A-B) as AB from Table" и dt.Compute("Sum(AB)","") .

Таким образом, ошибка устранена.