【发布时间】:2018-11-29 21:11:18
【问题描述】:
原谅我恶心的方法:我无法在 SQL 中做到这一点(因为我的使用是动态的,而且我对 SQL 的使用方式不够精通,无法让它创建我想要/需要的动态输出) 或 EF,因为由于某种未知原因,我无法让它工作(如果有人有一个示例可以帮助 EF 和 DataTables 的初学者,请分享)
我有一个 DataTable (dt),其中包含我试图提取、计算然后输入到另一个 DataTable (fDt) 的值。
dt 的示例:
+-------------------------------------------------------+
| ID | CustName | 201501 | 201502 | 201503 | 201504 | ..|
+-------------------------------------------------------+
| 32 | CustOne | 100.00 | 200.00 | 400.00 | 700.00 | ..|
| 56 | CustTwo | | | | 500.00 | ..|
| 89 | CustThree| 222.22 | 333.33 | 444.44 | 555.55 | ..|
| .. | ... | .. | .. | .. | .. | ..|
+-------------------------------------------------------+
我想将 after CustName 的值用于我的计算。
然后计算得出上表中两列之间的百分比差异:
+-------------------------------------------------------+
| ID | CustName | PerDiff02 | PerDiff03 | PerDiff04 | ..|
+-------------------------------------------------------+
| 32 | CustOne | 0 | 100 | 200 | ..|
| 56 | CustTwo | | | 85.00 | ..|
| 89 | CustThree| 66.66 | 75.00 | 80.00 | ..|
| .. | ... | .... | .... | .... | ..|
+-------------------------------------------------------+
(百分比是假的,但它们显示了我想要达到的目标。)
PerDiffs 应该从显示的第二个月 (201502) 开始并持续到当前。
我相信我已经做到了,但是使用我现在拥有的代码:
for (i = 2; i <= (dt.Columns.Count - 2); i++)
{
for (int j = 0; j < (dt.Columns.Count); j++)
{
//decimal? month1 = dt.Rows[i].Field<decimal?>(j);
//decimal? month2 = dt.Rows[i].Field<decimal?>(j + 2);
decimal? month1 = (decimal?)dt.Rows[i][j];
decimal? month2 = (decimal?)dt.Rows[i][j + 2];
fDt.Rows[i][j - 1] = ((month1 - month2) / month1) * 100;
}
}
我已经包含了两行注释掉的行,因为它们产生的错误与我当前在此循环中遇到的错误相同:
指定的演员表无效。
对于声明month1 和month2 的行。
问题:
如何将我的一个Cells 中的一个DataTable 中的一个等式中的数据输入到另一个DataTable 中?
如果有什么不清楚的地方,请告诉我!
编辑:
这是我获取数据表的整个方法:
public DataTable GetPerDiff(DataTable dt)
{
var fDt = new DataTable();
int i;
int fieldCount = dt.Columns.Count;
string[] colHeaders = new string[fieldCount];
for (i = 0; i < fieldCount; i++)
{
colHeaders[i] = dt.Columns[i].ToString();
}
fDt.Columns.Add(colHeaders[0]);
fDt.Columns.Add(colHeaders[1]);
//Get's the data into the new table
for (i = 1; i < dt.Rows.Count-1; i++)
{
fDt.Rows.Add(dt.Rows[i][0], dt.Rows[i][1]);
}
// Gets the column headers for dataTable fDt
for (i = 2; i <= (dt.Columns.Count - 2); i++)
{
string colName = "PerDiff" + dt.Columns[i + 1];
fDt.Columns.Add(colName);
}
for (i = 2; i <= (dt.Columns.Count - 2); i++)
{
for (int j = 0; j < (dt.Columns.Count); j++)
{
//decimal? month1 = dt.Rows[i].Field<decimal?>(j);
//decimal? month2 = dt.Rows[i].Field<decimal?>(j + 2);
decimal? month1 = (decimal?)dt.Rows[i][j];
decimal? month2 = (decimal?)dt.Rows[i][j + 2];
fDt.Rows[i][j - 1] = ((month1 - month2) / month1) * 100;
}
}
return dt;
}
【问题讨论】:
-
第二个表是否已经存在并且您正在尝试填充它,或者您是否尝试从第一个表创建它?
-
@BrianRogers ,第二个表已经存在,并且所需的前两列数据(ID,CustName)和其余列所需的列标题都已创建。