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

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










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值