我正在使用c#开发一个Web应用程序。我正在从数据库中读取一些名为dt的数据表。样本数据如下所示。
agentName WeekNumber Score
John 3 45
John 5 78
John 6 33
我想根据某些条件对上述数据进行一些更改。因为我想根据这些数据绘制图形。代理名称始终相同。周字段是唯一的。我想使用下面列出的条件创建一个新的数据表。
1 - 新数据表周字段必须从1开始。如果第1周数据表中没有条目,您可以将数据添加到新数据表中,如下所示
John 1 0
这意味着只需将0作为分数。
2 - 如果从数据库获取的数据表中第二行以后有任何缺失的周数,则添加该周的行,得分为-1。 在上面的例子中,在第一行之后有一个缺失的第4周。所以将它添加到得分为-1的新数据表
新数据标签; e示例数据位于
之下agentName WeekNumber Score
John 1 0
John 2 0
John 3 45
John 4 -1
John 5 78
John 6 33
如何使用c#在有效的方法中完成?行数会有所不同。 我想用c#来做。不是因为某种原因使用查询
答案 0 :(得分:3)
在数据库中有一个表,其中包含一年中每周的默认值。 左边在选择结果时加入此表,如果缺少另一个则采用默认值。
e.g。
select
dt.name,
def.week_no,
(case dt.value is null then def.value else dt value end) value
from
def left join dt on def.week_no = dt.week_no
代码未经测试,但应该从默认表中获取所有内容,并从dt表中获取它们存在的行。如果dt行不存在,则将采用默认值。
其中dt是包含值的现有表,def是每周默认值的表。
答案 1 :(得分:2)
您可以使用以下类并从中构建新表。
class AgentsData
{
public static DataTabe ProcessDataTabe(DataTable dt)
{
Dictionary<string, AgentData> data = new Dictionary<string, AgentData>();
for (int i = 0; i < dt.Rows.Count; i++)
{
string name = dt.rows[i][0].ToString();
if (!data.ContainsKey(name))
data.Add(name, new AgentData);
int week = Convert.ToInt32(dt.rows[i][1]);
int score = Convert.ToInt32(dt.rows[i][2]);
data[name].Add(week, score);
}
foreach (vat agentData in data.Values)
agentData.Process();
//now build new data table from dictionary and return it
}
}
class AgentData
{
public AgentData(string name)
{
Name = name;
WeekScore = new Dictionary<int,int>();
}
public void Add(int weekNumber, int score)
{
WeekScore[weekNumber] = score;
}
public void Process()
{
int min = WeekScore.Keys.Min();
int max = WeekScore.Keys.Max();
for (int i = 0; i < min; i++)
WeekScore.Add(i, 0);
for (int i = min + 1; i < max; i++)
if (!WeekScore.ContainsKey(i))
WeekScore.Add(i, -1);
}
public string Name {get; private set;}
public Dictionary<int, int> WeekScore { get; private set;}
}