C# datatable过滤某一列的重复数据(相当于distinct)

来源:互联网 发布:mysql 修改字段长度 编辑:程序博客网 时间:2024/05/21 17:19

1.问题描述

在程序代码中有一个查询出来的datatable,暂且叫他A,数据结构如下:

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表用于打印报表,将他的数据结果转换成下面这种形式:

B表

日期
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";                }