1.问题描述
在程序代码中有一个查询出来的datatable,暂且叫他A,数据结构如下:
日期
|
检测方法
|
检测数量
|
01
|
A
|
10
|
01
|
B
|
11
|
01
|
C
|
8
|
02
|
A
|
13
|
02
|
B
|
9
|
03
|
A
|
7
|
03
|
B
|
12
|
03
|
C
|
11
|
我要做的是处理这个A表用于打印报表,将他的数据结果转换成下面这种形式:
日期
|
A检测方法
|
B检测方法
|
C方法
|
01
|
10
|
11
|
8
|
02
|
13
|
9
|
|
03
|
7
|
12
|
11
|
2.思路:
刚开始做的时候思路很乱(其实压根就是上来就foreach循环然后调试。。),写了几个循环发现貌似搞不了,如果可以搞的话,非常感谢你能留言我们一起交流。
然后开始查阅相关资料,发现C#操作datatable可以使用datatable.Select("column1='条件'")来筛选需要筛选的数据,条件可以有多个,返回的结果为DataRow[]集合。
再来看表A的结构,日期有重复,使用datateble.DefaultView.ToDataTable(true,new string[] { "column1" })过滤需要过滤的数据,相当于sql语句中的distinct用法,可以有多列。
关键语法:
DataRow[] drArr = DataTable1.Select("clumn1='条件'") //按条件查询结果
DataTable dt = DataTable1.DefaultView.ToTable(true,new string[] { "column1" }) //过滤数据
3.部分代码:
string a = "select car_zhdate,car_testtype,count(0) 每天各个检测方法检测数量 from Tj_Car_TestType group by car_zhdate,car_testtype order by car_zhdate,car_testtype";//每天各个检测方法检测多少车
string b = "select a.car_zhdate,各天初检合格数量,各天初检总数量,isnull(各天复检合格数量,0) 各天复检合格数量,isnull(各天复检总数量,0) 各天复检总数量 from " +
"(select car_zhdate,count(0) 各天初检合格数量 from Tj_Car_TestType where car_evl='T' and car_ccdate=car_zhdate and car_rettest='1' group by car_zhdate) a " +
"left join " +
"(select car_zhdate,count(0) 各天初检总数量 from Tj_Car_TestType where car_ccdate=car_zhdate and car_rettest='1' group by car_zhdate ) b " +
"on a.car_zhdate = b.car_zhdate " +
"left join " +
"(select car_zhdate,count(0) 各天复检合格数量 from Tj_Car_TestType where car_evl='T' and car_ccdate=car_zhdate and car_rettest='2' group by car_zhdate) c " +
"on a.car_zhdate=c.car_zhdate " +
"left join " +
"(select car_zhdate,count(0) 各天复检总数量 from Tj_Car_TestType where car_ccdate=car_zhdate and car_rettest='2' group by car_zhdate ) d " +
"on a. car_zhdate=d.car_zhdate";
DataTable aa = SqlHelper.ExecuteDataset(CommandType.Text, a).Tables[0];
DataTable bb = SqlHelper.ExecuteDataset(CommandType.Text, b).Tables[0];
DataTable tempdb = new DataTable();
tempdb.Columns.Add("ri", typeof(string));
tempdb.Columns.Add("asm", typeof(string));
tempdb.Columns.Add("sds", typeof(string));
tempdb.Columns.Add("btg", typeof(string));
tempdb.Columns.Add("sub", typeof(string));
tempdb.Columns.Add("cjhgl", typeof(string));
tempdb.Columns.Add("fjhgl", typeof(string));
string sub = ""; string cjhgl = ""; string fjhgl = "";
foreach (DataRow dr in bb.Rows)
{
sub = Convert.ToString(Convert.ToInt32(dr["各天初检总数量"].ToString()) + Convert.ToInt32(dr["各天复检总数量"].ToString()));
cjhgl = (Convert.ToDecimal(dr["各天初检合格数量"].ToString()) / Convert.ToDecimal(dr["各天初检总数量"].ToString())).ToString("P");
if (dr["各天复检总数量"].ToString() == "0")
{
fjhgl = "无复检车辆";
}
else
{
fjhgl = (Convert.ToDecimal(dr["各天复检合格数量"].ToString()) / Convert.ToDecimal(dr["各天复检总数量"].ToString())).ToString("P");
}
tempdb.Rows.Add("", "", "", "", sub, cjhgl, fjhgl);
}
DataRow[] sdsarr; DataRow[] asmarr; DataRow[] btgarr;
DataTable ritable = aa.DefaultView.ToTable(true, new string[] { "car_zhdate" });
int ricount = ritable.Rows.Count;
for (int i = 0; i < ricount; i++)
{
sdsarr = aa.Select("car_zhdate='" + ritable.Rows[i]["car_zhdate"].ToString() + "' and car_testtype='0'");
asmarr = aa.Select("car_zhdate='" + ritable.Rows[i]["car_zhdate"].ToString() + "' and car_testtype='1'");
btgarr = aa.Select("car_zhdate='" + ritable.Rows[i]["car_zhdate"].ToString() + "' and car_testtype='4'");
tempdb.Rows[i]["ri"] = ritable.Rows[i]["car_zhdate"].ToString();
if (sdsarr.Length > 0)
tempdb.Rows[i]["sds"] = sdsarr[0]["每天各个检测方法检测数量"].ToString();
else
tempdb.Rows[i]["sds"] = "0";
if (asmarr.Length > 0)
tempdb.Rows[i]["asm"] = asmarr[0]["每天各个检测方法检测数量"].ToString();
else
tempdb.Rows[i]["asm"] = "0";
if (btgarr.Length > 0)
tempdb.Rows[i]["btg"] = btgarr[0]["每天各个检测方法检测数量"].ToString();
else
tempdb.Rows[i]["btg"] = "0";
}