#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
indistinctTable
являются числами, но хранятся в столбце типа 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)","")
.
Таким образом, ошибка устранена.