求高手帮忙给个思路,关于操作dataTable

ximomomoxinei31 2012-01-18 04:19:56
通过很长的一条sql语句将三个表中left join 得到一个结果,填充到dataTalbe然后绑定给datagridview,datagridview看到的数据如下->


日期 点击量 对话量 有效对话量 预约量 预计到诊量 实际到诊量
.
..
...
2012-01-17 2000 700 40 30 300 8
2012-01-18 1000 200 50 40 280 10
...
..
.


我现在要对这个dataTable进行一定的处理,最终想得到下面这个样子->

时间段 点击量 对话量 有效对话量 预约量 预计到诊量 实际到诊量
今天 1000 200 50 40 280 10
昨天 2000 700 40 30 300 8
近一周 6000 2000 1000 100 600 50
当月 24000 8000 4000 412 20000 303
上月 25000 9000 4500 500 21000 400
当年 300000 108000 54000 6000 220000 4800


应该如何对dataTalbe进行处理呢?希望高手指点或给个思路

附项目中填充dataTable的代码->

private DataView GetOrderComeAnalysis()
{
List<OrderComeAnalysisModel> ocamList = ocabll.GetOrderComeAnalysisInfo();

//建立DataTalbe
DataTable dtEmployeePerformanceCount = new DataTable("Table_OrderComeAnalysis");
dtEmployeePerformanceCount.Columns.Add("医院", System.Type.GetType("System.String"));
dtEmployeePerformanceCount.Columns.Add("日期", System.Type.GetType("System.DateTime"));
dtEmployeePerformanceCount.Columns.Add("点击量", System.Type.GetType("System.Int32"));
dtEmployeePerformanceCount.Columns.Add("对话量", System.Type.GetType("System.Int32"));
dtEmployeePerformanceCount.Columns.Add("有效对话量", System.Type.GetType("System.Int32"));
dtEmployeePerformanceCount.Columns.Add("预约量", System.Type.GetType("System.Int32"));
dtEmployeePerformanceCount.Columns.Add("预计到诊量", System.Type.GetType("System.Int32"));
dtEmployeePerformanceCount.Columns.Add("到诊量", System.Type.GetType("System.Int32"));

//添加数据
for (int i = 0; i < ocamList.Count; i++)
{
DataRow dr = dtEmployeePerformanceCount.NewRow();

if (ocamList[i].ProjectId != 0)
dr["医院"] = dd.dicProject[ocamList[i].ProjectId];
dr["日期"] = ocamList[i].Date;
dr["预约量"] = ocamList[i].OrderCount;
dr["到诊量"] = ocamList[i].ComeCount;
dr["预计到诊量"] = ocamList[i].ForecastComeCount;
dr["点击量"] = ocamList[i].ClickAmount;
dr["对话量"] = ocamList[i].LocalAllCount + ocamList[i].NoLocalAllCount;
dr["有效对话量"] = ocamList[i].LocalValidCount + ocamList[i].NoLocalValidCount;
dtEmployeePerformanceCount.Rows.Add(dr);
}
return new DataView(dtEmployeePerformanceCount);
}

界面显示时以医院名称进行筛选-> dv.RowFilter = string.Format("医院='{0}'", cmb_hospitalName.Text);//过滤



希望高手帮帮忙看看我这个功能应该怎么实现,谢谢了先!!!!
...全文
266 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ximomomoxinei31 2012-01-19
  • 打赏
  • 举报
回复
谢谢各位指点 结帖了
格桑花 2012-01-19
  • 打赏
  • 举报
回复
你可以后台写个方法,对取出来的 ocamList[i].Date进行处理,处理结果再赋值给 dr["日期"] ,例如,你定义一个方法CheckDate(string date),在方法里面进行判断,最后赋值 dr["日期"] = CheckDate(ocamList[i].Date);

或者在sql语句里面使用case when 处理

ctdiskdownload 2012-01-19
  • 打赏
  • 举报
回复
这个里面说的很详细 后面跟的是连接
ASP.NET.3.5揭秘(卷1).pdf: gg.ma/download_4244280.html
具体位置在17章 说的一般详细 可以作为参考



LMAOhuaNL 2012-01-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 charles_y 的回复:]

第一种方法,用sql语句统计, select sum(..) from tablexxx where time between x and y
当然要做好几次,然后组织填入你的datatable 中。

第二种方法,全部取出来,自己计算后,填入datatable。

大数据量的话要用第一种方法,不然仅仅取数据就把数据库搞死了
[/Quote]+
ximomomoxinei29 2012-01-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sandy945 的回复:]

在SQL中处理的话,就是把结果集存成临时表

然后对临时表进行汇总统计 根据指定日期, 如果不是很复杂的话,甚至临时表都可以省略

临时表的内容就是你现在DataTable 的内容

C# 中的话 也是一样,可以用 linq 也可以用 DataTable 自己的方法进行sum
[/Quote]
临时表没用过 找时间补下吧
我先把功能实现了 回头时间充裕了再用DataTable自己的方式把 主要是时间来不及学习新知识了
阿非 2012-01-18
  • 打赏
  • 举报
回复
在SQL中处理的话,就是把结果集存成临时表

然后对临时表进行汇总统计 根据指定日期, 如果不是很复杂的话,甚至临时表都可以省略

临时表的内容就是你现在DataTable 的内容

C# 中的话 也是一样,可以用 linq 也可以用 DataTable 自己的方法进行sum
accomp 2012-01-18
  • 打赏
  • 举报
回复
1 .按我上面说的创建一个新datatable . 添加2列 : 医院和时间段
2.
for (int i = 0; i < dt.Rows.Count; i++)
{
if (Convert.ToDateTime(dt.Rows[i]["日期"]).Date == DateTime.Now.Date)
{
newDt.Rows[0]["点击量"] += convert.ToInt32(newDt.Rows[0]["点击量"] )+convert.ToInt32(dt.Rows[i]["点击量"] );
// 别的字段类似 ...省略
}
else if( Convert.ToDateTime(dt.Rows[i]["日期"]).Date == DateTime.Now.AddDays(-1).Date
{
newDt.Rows[0]["点击量"] += convert.ToInt32(newDt.Rows[0]["点击量"] )+convert.ToInt32(dt.Rows[i]["点击量"] );
// 别的字段类似 ...省略

}
下面一样

}
bwangel 2012-01-18
  • 打赏
  • 举报
回复
还是用数据库里汇总比较好。这种数据量一般是超大的,用datatable会把客户端涨死。
这种sql并不难写,无非是SELECT COUNT(*) FROM 表 WHERE Date LIKE '2011%' 按年
ximomomoxinei31 2012-01-18
  • 打赏
  • 举报
回复
写到一半了 高手看看我这样做合理么->

//近一周用到的变量
int 点击量 = 0;
int 对话量 = 0;
int 有效对话量 = 0;
int 预约量 = 0;
int 预计到诊量 = 0;
int 到诊量 = 0;

for (int i = 0; i < dt.Rows.Count; i++)
{
if (Convert.ToDateTime(dt.Rows[i]["日期"]) == DateTime.Now.Date)
{
newDT.Rows[0]["医院"] = dt.Rows[i]["医院"];
newDT.Rows[0]["时间段"] = "今天";
newDT.Rows[0]["点击量"] = dt.Rows[i]["点击量"];
newDT.Rows[0]["对话量"] = dt.Rows[i]["对话量"];
newDT.Rows[0]["有效对话量"] = dt.Rows[i]["有效对话量"];
newDT.Rows[0]["预约量"] = dt.Rows[i]["预约量"];
newDT.Rows[0]["预计到诊量"] = dt.Rows[i]["预计到诊量"];
newDT.Rows[0]["到诊量"] = dt.Rows[i]["到诊量"];
}

if (Convert.ToDateTime(dt.Rows[i]["日期"]) == DateTime.Now.Date.AddDays(-1))
{
newDT.Rows[1]["医院"] = dt.Rows[i]["医院"];
newDT.Rows[1]["时间段"] = "昨天";
newDT.Rows[1]["点击量"] = dt.Rows[i]["点击量"];
newDT.Rows[1]["对话量"] = dt.Rows[i]["对话量"];
newDT.Rows[1]["有效对话量"] = dt.Rows[i]["有效对话量"];
newDT.Rows[1]["预约量"] = dt.Rows[i]["预约量"];
newDT.Rows[1]["预计到诊量"] = dt.Rows[i]["预计到诊量"];
newDT.Rows[1]["到诊量"] = dt.Rows[i]["到诊量"];
}

if (Convert.ToDateTime(dt.Rows[i]["日期"]) <= DateTime.Now.Date && Convert.ToDateTime(dt.Rows[i]["日期"]) > DateTime.Now.Date.AddDays(-7))
{
newDT.Rows[2]["医院"] = dt.Rows[i]["医院"];
newDT.Rows[2]["时间段"] = "近一周";

点击量 += Convert.ToInt32(dt.Rows[i]["点击量"]);
对话量 += Convert.ToInt32(dt.Rows[i]["对话量"]);
有效对话量 += Convert.ToInt32(dt.Rows[i]["有效对话量"]);
预约量 += Convert.ToInt32(dt.Rows[i]["预约量"]);
预计到诊量 += Convert.ToInt32(dt.Rows[i]["预计到诊量"]);
到诊量 += Convert.ToInt32(dt.Rows[i]["到诊量"]);

newDT.Rows[2]["点击量"] = 点击量;
newDT.Rows[2]["对话量"] = 对话量;
newDT.Rows[2]["有效对话量"] = 有效对话量;
newDT.Rows[2]["预约量"] = 预约量;
newDT.Rows[2]["预计到诊量"] = 预计到诊量;
newDT.Rows[2]["到诊量"] = 到诊量;
}
}
大雷神 2012-01-18
  • 打赏
  • 举报
回复
DateTime dt =DateTime.Parse( System.DateTime.Now.ToString("yyyy-MM-dd"));//获取当前时间
//绑定的时候
dr["时间段"] = (DateTime.Parse(ocamList[i].Date.TotString("yyyy-mm-dd"))-dt)==0?"今天"((DateTime.Parse(ocamList[i].Date.TotString("yyyy-mm-dd"))-dt)==-1?"昨天":
(dt-DateTime.Parse(ocamList[i].Date.TotString("yyyy-mm-dd"))>1&&dt-DateTime.Parse(ocamList[i].Date.TotString("yyyy-mm-dd"))<7);"近一周":("自己写吧")


就用当时的时间(也可以去数据库中的时间)跟绑定的时间进行比较 就可以了 别想复杂了
类似
var question = answer=="A"?"你选择了A":
(answer=="B"?"你选择了B":
(answer=="C"?"你选择了C":"你选择了D" ))

ximomomoxinei31 2012-01-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 accomp 的回复:]
1 创建一个新datatable ,里面有六条数据。
今天 0 0 0 0 0 0
昨天 0 0 0 0 0 0
近一周 0 0 0 0 0 0
当月 0 0 0 0 0 0
上月 0 0 0 0 0 0
当年 0 0 0 0 0 0
2。对原来的查询结果进行循环 ,判断每条数据的时间,根据时间,往新datatable相应的数据,进行加算 。
……
[/Quote]
嗯 我先试试看!
ximomomoxinei31 2012-01-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 charles_y 的回复:]
第一种方法,用sql语句统计, select sum(..) from tablexxx where time between x and y
当然要做好几次,然后组织填入你的datatable 中。

第二种方法,全部取出来,自己计算后,填入datatable。

大数据量的话要用第一种方法,不然仅仅取数据就把数据库搞死了
[/Quote]
我准备尝试全部取出来以后遍历dataTalbe 逐条处理 现阶段先实现功能 待日后时间充裕再考虑数据库压力问题
ximomomoxinei31 2012-01-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ruanwei1987 的回复:]
最近一周,包括今天和昨天吗,
如果今天是星期一,那还包裹昨天吗


当月,
当年

在数据库中通过聚合取得,
你应该能办到的
[/Quote]
最近一周就是指七天前到今天 周六周日也算为工作日!!
charles_y 2012-01-18
  • 打赏
  • 举报
回复
第一种方法,用sql语句统计, select sum(..) from tablexxx where time between x and y
当然要做好几次,然后组织填入你的datatable 中。

第二种方法,全部取出来,自己计算后,填入datatable。

大数据量的话要用第一种方法,不然仅仅取数据就把数据库搞死了
ruanwei1987 2012-01-18
  • 打赏
  • 举报
回复
最近一周,包括今天和昨天吗,
如果今天是星期一,那还包裹昨天吗


当月,
当年

在数据库中通过聚合取得,
你应该能办到的
accomp 2012-01-18
  • 打赏
  • 举报
回复
1 创建一个新datatable ,里面有六条数据。
今天 0 0 0 0 0 0
昨天 0 0 0 0 0 0
近一周 0 0 0 0 0 0
当月 0 0 0 0 0 0
上月 0 0 0 0 0 0
当年 0 0 0 0 0 0
2。对原来的查询结果进行循环 ,判断每条数据的时间,根据时间,往新datatable相应的数据,进行加算 。


naonaoye 2012-01-18
  • 打赏
  • 举报
回复
感觉应该在sql里直接统计好再赋给datatable
莫舍桥西 2012-01-18
  • 打赏
  • 举报
回复
这个最好在写sql的时候加一个根据日期判断字段,然后在填充到datatable中去
ximomomoxinei31 2012-01-18
  • 打赏
  • 举报
回复
年前要做完这些 时间很敢 希望高手有时间最好能给点代码 谢谢了!!

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧