我有数据表,其中附有两个表。我有很多行,其中有两行是Total和Rate。(注意这是我的Datatable中的行)。我想通过乘以两行来计算总金额。我该怎么做数据表来自sql Compact,我无法进行计算,因为根据必须完成的某些设置,并不总是需要它。它甚至可以是百分比计算或任何事情。有没有办法在datatable中的2行之间进行计算?我正在使用C#。我尝试过计算功能,但无法实现。该表可能如下所示:
标题Prod1 Prod2 Prod3 10 20 30 0 20 10 5 6 0 50 0 0 总计65 46 40 费率10 20 10 金额650 920 400
,即总和= Prodi的总和,i = 1,2,3
和金额=总计*费率。
应该有一些方法来实现这一目标。我该怎么办?
提前致谢。
答案 0 :(得分:1)
你能做的是:
修改强>
也许我没有完全理解你的数据结构。那么让我们来看看一些场景。如果您不在那里,请提供有关数据表中某一行的实际情况的详细信息:
案例a :数据存储在列中,您还需要该行中的总计和金额列
Value1 Value2 Value3 Rate Total Amount
1 5 3 10 ? ?
您可以按如下方式调整SQL语句:
SELECT Value1, Value2, Value3, Rate,
(Value1+Value2+Value3) AS Total,
((Value1+Value2+Value3) * Rate) AS Amount
FROM <table>
或者,如果您在C#中使用类型化数据集,则可以使用普通SELECT * ...
语句,并将具有相应表达式(Expression
属性 - 相当于计算列的列)的列手动添加到您键入的数据集中的表。
案例b :数据存储在行中,您希望总计和金额也是行
RowTitle Value
Value1 1
Value2 5
Value3 2
Rate 10
现在你需要在C#中使用for循环迭代所有行,总结值然后用RowTitle
“Total”和“Amount”创建两个新行并将它们添加到你的表中
编辑2
您,我从您的第二条评论中了解到您实际上在数据库中有两个表。一个包含实际数据,另一个包含费率。您现在可以根据用户定义的设置从这些表中进行选择,实际上您在C#中的数据集中有两个表 - 一个用于该数据,一个用于速率。
AFAIK SQL Server Compact Edition不允许您使用JOIN
,但这本来是最简单的:从数据表中选择数据并将其加入“费率”表,选择相应的费率根据用户设置。然后你可以进行我在上面“案例a”中记录的计算。
但是,我认为你不能使用JOIN
,所以我建议你将数据输入你的应用程序(产生两个单独的表,一个用于数据,一个用于速率)。您修改了数据SELECT
声明,以便获得一个默认值为Amount
的其他列0
。
SELECT *, 0 AS Amount FROM <data table>
然后,在C#中,您遍历数据表中的所有记录,并计算记录的Amount
值。
private void GetData(...)
{
// Call SELECT statements to fill a dataset with two tables
DataSet set = new DataSet();
....
// set now contains tables[0] (for the data) and tables[1] (for the Rate).
// Get the Rate
int rate = (int)set.Tables[1].Rows[0]["Rate"]; // Assuming that the column is named "Rate"
// Now iterate over all data rows and calculate amount
foreach (DataRow row in set.Tables[0])
{
row["Amount"] = ((int)row["Total"] * rate);
}
// Mark the data set as unmodified
set.AcceptChanges();
}
请注意,此代码可能需要一些调整 - 我实际上没有测试过它。如果“Rate”-Table包含多行并且需要根据其他设置选择正确的速率,您可以考虑根据这些设置创建一个返回正确行的函数:
private DataRow FindRateRow(DataSet set, <parameters for selecting the correct row>)
{
DataRow[] row = set.Tables[1].Select(<Filter string according to parameters>);
if (row != null && row.Length > 0)
return row[0];
return null;
}
使用上面的int rate = (int)FindRateRow(set, ...)["Rate"];
。