如何使用 GroupBy 计数-Count()

简介: 十年河东,十年河西,莫欺少年穷。本节探讨的内容很简单,就是如果使用GroupBy计数提供两种方法:第一:把查询的数据,转化为泛型,然后泛型分组计数。                        第二:Linq语句直接分组计数有如下范例:SQL如下:create table S_ca...

十年河东,十年河西,莫欺少年穷。

本节探讨的内容很简单,就是如果使用GroupBy计数

提供两种方法:第一:把查询的数据,转化为泛型,然后泛型分组计数。

                        第二:Linq语句直接分组计数

有如下范例:

SQL如下:

create table S_cate
(
cateId int identity(1,1) primary key,
cateName varchar(20),
)

create table S_info
(
Sid int identity(1,1) primary key,
cateId int   FOREIGN KEY REFERENCES S_cate(cateId),
content varchar(100)
)

insert into S_cate values('苹果')
insert into S_cate values('香蕉')
insert into S_cate values('橘子')
insert into S_cate values('桃子')

insert into S_info values(1,'引用苹果')
insert into S_info values(1,'引用苹果')
insert into S_info values(1,'引用苹果')
insert into S_info values(1,'引用苹果')

insert into S_info values(2,'引用香蕉')
insert into S_info values(2,'引用香蕉')
insert into S_info values(2,'引用香蕉')

insert into S_info values(3,'引用橘子')
insert into S_info values(3,'引用橘子')
View Code

想要的结果为:

橘子:2  苹果:4  桃子:0  香蕉:3

那么用LINQ该如何实现呢?

首先新建返回的数据类型:

    public class MSTS
    {
        public int cateId { get; set; }

        public string cateName { get; set; }

        public int count { get; set; }
    }

我们采用cateId 和 cateName 联合分组:

LINQ如下:

#region 分组测试
        /// <summary>
        ///LINQ分组示例
        /// </summary>
        /// <returns></returns>
        public List<MSTS> GetCates()
        {
            using (AnbSosCustomerEntities context = new AnbSosCustomerEntities())
            {
                List<MSTS> Mlist = new List<MSTS>();
                var S_cate = context.S_cate;
                var S_info = context.S_info;
                //
                var Query = from Cate in S_cate
                            join Info in S_info on Cate.cateId equals Info.cateId into temp
                            from tt in temp.DefaultIfEmpty()
                            select new
                            {
                                cateId=Cate.cateId,
                                cateName = Cate.cateName,
                                content=tt.content
                            };

                var data = Query.GroupBy(a => new { a.cateId, a.cateName }).Select(a => new MSTS { cateName = a.Key.cateName, cateId = a.Key.cateId, count = a.Count(C => C.content != null) });
                Mlist = data.ToList();
                 return Mlist;
            }
        }
        #endregion

其实上述的LINQ相信大家都能很快写出来,但是我要强调的是Count('里面的参数')

也就是这一句:

加上这句筛选,就是为了防止将桃子统计为 1

这样调试的结果为:

以上便是第一种方法!

那么第二种方法也很简单,思路是:左连接查询数据,然后把查询的结果转化为泛型,最后利用泛型分组:

在此直接上代码了:

MSTS类变更如下:

    public class MSTS
    {
        public int cateId { get; set; }

        public string cateName { get; set; }

        public string content { get; set; }
    }

LINQ查询变更如下:

#region 分组测试
        /// <summary>
        ///LINQ分组示例
        /// </summary>
        /// <returns></returns>
        public List<MSTS> GetCates()
        {
            using (AnbSosCustomerEntities context = new AnbSosCustomerEntities())
            {
                List<MSTS> Mlist = new List<MSTS>();
                var S_cate = context.S_cate;
                var S_info = context.S_info;
                //
                var Query = from Cate in S_cate
                            join Info in S_info on Cate.cateId equals Info.cateId into temp
                            from tt in temp.DefaultIfEmpty()
                            select new MSTS
                            {
                                cateId = Cate.cateId,
                                cateName = Cate.cateName,
                                content = tt.content
                            };


                Mlist = Query.ToList();
                return Mlist;
            }
        }
        #endregion

调试实时信息如下:

从调试信息可以看出:因为桃子没被引用过,所以桃子对应的content为null

那么泛型的分组也和linq一样,都是要筛选这个字段的值

泛型分组如下:

        IBase Implement = new BaseImplement();
        protected void Page_Load(object sender, EventArgs e)
        {
            List<MSTS> ls = new List<MSTS>();
            ls = Implement.GetCates();
            var Gls = ls.GroupBy(a => new { a.cateId,a.cateName}).Select(g => (new { cateName = g.Key.cateName,cateId=g.Key.cateId, count = g.Count(A=>A.content!=null) }));
           foreach (var item in Gls)
           {
               Response.Write(item.cateName + "的数量为:" + item.count + "");
           }
        }

@陈卧龙的博客

相关文章
|
8天前
|
数据库
count(1)、count(*)、count(column)的含义、区别、执行效率
总之,`count(1)` 和 `count(*)` 通常会更常用,因为它们的执行效率较高,不涉及对具体列值的处理。而 `count(column)` 适用于统计特定列中的非空值数量。在实际使用时,可以根据情况选择适合的方式。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
15 0
|
8天前
ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)
ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)
44 0
|
6月前
|
存储 SQL 关系型数据库
count(1)、count(具体字段)和count(*)究竟有什么区别?
count(1)、count(具体字段)和count(*)究竟有什么区别?
63 0
|
9月前
|
SQL 数据可视化 关系型数据库
count(列名) ,count(1)与count(*) 有何区别?
count(列名) ,count(1)与count(*) 有何区别?
|
存储 SQL 架构师
性能大PK count(*)、count(1)和count(列)
最近的工作中,我听到组内两名研发同学在交流数据统计性能的时候,聊到了以下内容: 数据统计你怎么能用 count(*) 统计数据呢,count(*) 太慢了,要是把数据库搞垮了那不就完了么,赶紧改用 count(1),这样比较快...... 有点儿好奇,难道 count(1) 的性能真的就比 count(*) 要好吗? 印象中网上有很多的文章都有过类似问题的讨论,那 MySQL 统计数据总数 count(*) 、count(1)和count(列名) 哪个性能更优呢?今天我们就来聊一聊这个问题。
性能大PK count(*)、count(1)和count(列)
DS之信息挖掘:利用pandas库统计某一列col中各个值出现的次数(降序输出)
DS之信息挖掘:利用pandas库统计某一列col中各个值出现的次数(降序输出)
DS之信息挖掘:利用pandas库统计某一列col中各个值出现的次数(降序输出)
|
SQL 分布式计算 Spark
如何在Spark中实现Count Distinct重聚合
Count Distinct是SQL查询中经常使用的聚合统计方式,用于计算非重复结果的数目。由于需要去除重复结果,Count Distinct的计算通常非常耗时。本文主要介绍在Spark中如何基于重聚合实现交互式响应的COUNT DISTINCT支持。
|
关系型数据库 数据库
都2020年了,你还不知道count(1)和count(*)谁效率更高吗?
今天公司的一个需求需要统计一个数据库中表的行数有多少,二话不说当然就直接用count()这个聚合函数,以前经常听到一种说法说count(1)的效率比count(*)要高,于是测试了一下count(1)和count(*)的速度差距,发现两者的查询速度很接近,甚至count(*)要更快一些,于是就有了这篇文章。