SQL50题

作者: ZachXu | 来源:发表于2019-07-02 00:15 被阅读0次

    数据表介绍

    --1.学生表 Student(SId, Sname, Sage, Ssex)
    SId 学生编号, Sname 学生姓名, Sage 出生年月, Ssex 学生性别
    --2.课程表 Course(CId, Cname, TId)
    CId 课程编号, Cname 课程名称, TId 教师编号
    --3.教师表 Teacher(TId, Tname)
    TId 教师编号, Tname 教师姓名
    --4.成绩表 SC(SId, CId, score)
    SId 学生编号, CId 课程编号, score 分数

    学生表 Student:

    create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10));
    insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
    insert into Student values('02' , '钱电' , '1990-12-21' , '男');
    insert into Student values('03' , '孙风' , '1990-12-20' , '男');
    insert into Student values('04' , '李云' , '1990-12-06' , '男');
    insert into Student values('05' , '周梅' , '1991-12-01' , '女');
    insert into Student values('06' , '吴兰' , '1992-01-01' , '女');
    insert into Student values('07' , '郑竹' , '1989-01-01' , '女');
    insert into Student values('09' , '张三' , '2017-12-20' , '女');
    insert into Student values('10' , '李四' , '2017-12-25' , '女');
    insert into Student values('11' , '李四' , '2012-06-06' , '女');
    insert into Student values('12' , '赵六' , '2013-06-13' , '女');
    insert into Student values('13' , '孙七' , '2014-06-01' , '女');
    

    科目表 Course:

    create table Course(CId varchar(10),Cname nvarchar(10),TId varchar(10));
    insert into Course values('01' , '语文' , '02');
    insert into Course values('02' , '数学' , '01');
    insert into Course values('03' , '英语' , '03');
    

    教师表 Teacher:

    create table Teacher(TId varchar(10),Tname varchar(10));
    insert into Teacher values('01' , '张三');
    insert into Teacher values('02' , '李四');
    insert into Teacher values('03' , '王五');
    

    成绩表 SC:

    create table SC(SId varchar(10),CId varchar(10),score decimal(18,1));
    insert into SC values('01' , '01' , 80);
    insert into SC values('01' , '02' , 90);
    insert into SC values('01' , '03' , 99);
    insert into SC values('02' , '01' , 70);
    insert into SC values('02' , '02' , 60);
    insert into SC values('02' , '03' , 80);
    insert into SC values('03' , '01' , 80);
    insert into SC values('03' , '02' , 80);
    insert into SC values('03' , '03' , 80);
    insert into SC values('04' , '01' , 50);
    insert into SC values('04' , '02' , 30);
    insert into SC values('04' , '03' , 20);
    insert into SC values('05' , '01' , 76);
    insert into SC values('05' , '02' , 87);
    insert into SC values('06' , '01' , 31);
    insert into SC values('06' , '03' , 34);
    insert into SC values('07' , '02' , 89);
    insert into SC values('07' , '03' , 98);
    

    题目:

    • 1.1 查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数
    • 1.2 查询同时存在"01"课程和"02"课程的情况
    • 1.3 查询存在"01"课程但可能不存在"02"课程的情况 (不存在时显示为 null)
    • 1.4 查询不存在"01"课程但存在"02"课程的情况
    • 2. 查询平均成绩大于等于 60 分的同学的学生编号、学生姓名和平均成绩
    • 3. 查询在 SC 表存在成绩的学生信息
    • 4. 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩 (没成绩的显示为 null)
    • 4.1 查有成绩的学生信息
    • 5. 查询「李」姓老师的数量
    • 6. 查询学过张三老师授课的同学的信息
    • 7. 查询没有学全所有课程的同学的信息
    • 8. 查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
    • 9. 查询和" 01 "号的同学学习的课程完全相同的其他同学的信息
    • 10. 查询没学过"张三"老师讲授的任一门课程的学生姓名
    • 11. 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
    • 12. 检索" 01 "课程分数小于 60,按分数降序排列的学生信息
    • 13. 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
    • 14. 查询各科成绩最高分、最低分和平均分:
    • 以如下形式显示:
    • 课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
    • (及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90)
    • 要求输出课程号和选修人数,查询结果按人数降序排列列,若人数相同,按课程号升序排列
    • 15. 按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺
    • 15.1 按各科成绩进行行排序,并显示排名, Score 重复时合并名次
    • 16. 查询学生的总成绩,并进行排名,总分重复时保留名次空缺
    • 16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
    • 17. 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比
    • 18. 查询各科成绩前三名的记录
    • 19. 查询每门课程被选修的学生数
    • 20. 查询出只选修两门课程的学生学号和姓名
    • 21. 查询男生、女生人数
    • 22. 查询名字中含有「风」字的学生信息
    • 23. 查询同名同性学生名单,并统计同名人数
    • 24. 查询 1990 年年出生的学生名单
    • 25. 查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
    • 26. 查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩
    • 27. 查询课程名称为「数学」,且分数低于 60 的学生姓名和分数
    • 28. 查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
    • 29. 查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
    • 30. 查询不及格的课程
    • 31. 查询课程编号为 01 且课程成绩在 80 分及以上的学生的学号和姓名
    • 32. 求每门课程的学生人数
    • 33. 成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
    • 34. 成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
    • 35. 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
    • 36. 查询每门成绩最好的前两名 (同18题)
    • 37. 统计每门课程的学生选修人数(超过 5 人的课程才统计)
    • 38. 检索至少选修两门课程的学生学号
    • 39. 查询选修了全部课程的学生信息
    • 40. 查询各学生的年龄,只按年份来算
    • 41. 按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一
    • 42. 查询本周过生日的学生
    • 43. 查询下周过生日的学生
    • 44. 查询本月过生日的学生
    • 45. 查询下月过生日的学生
    • 附加题:复购率计算

    1.1 查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数

    直接在原表中不好比较,自交

    select s.*, c.CId, c.score
    from student s left join sc c on s.SId = c.SId 
    where s.SId in( select a.SId 
                    from (select * from sc where CId = 01) a  inner join  
                         (select * from sc where CId = 02) b 
                    on a.SId = b.SId 
                    where a.score > b.score 
                    group by a.SId );
    

    除了用关联子查询,还可以用联结:

    select 学号, 课程号, 成绩
    from 成绩表 as a
    where 成绩>
        (select avg(成绩)
         from 成绩表 as b
         where a.课程号=b.课程号
         group by 课程号);
    
    select a.学号, a.课程号, a.成绩
    from 成绩表 a left join 
          (select 课程号, avg(成绩) as 平均成绩
          from 成绩表
          group by 课程号) b
    on a.课程号 = b.课程号
    where a.成绩 > b.平均成绩;
    
    select emp, sj, date
    from empo as a
    where date < 
        (select date
         from empo as b
         where a.sj = b.emp
         group by emp);
    
    select a.emp, a.date, b.emp, b.date
    from empo a left join empo b
    on a.sj = b.emp
    where a.date < b.date;
    

    1.2 查询同时存在"01"课程和"02"课程的情况

    同时存在,内联结

    select * 
    from  (select * from sc where CId=01) a inner join 
          (select * from sc where CId=02) b 
    on a.SId = b.SId
    

    1.3 查询存在"01"课程但可能不存在"02"课程的情况 (不存在时显示为 null)

    可能不存在其中一项,左/右联结

    select * 
    from  (select * from sc where CId=01) a left join 
          (select * from sc where CId=02) b 
    on a.SId = b.SId;
    

    1.4 查询不存在"01"课程但存在"02"课程的情况

    不存在"01"课程说明关联表"01"课程信息为null,但存在"02"课程说明关联表"02"课程信息存在

    select * 
    from  (select * from sc where CId=01) a right join 
          (select * from sc where CId=02) b 
    on a.SId = b.SId
    where a.SId is null;
    

    2. 查询平均成绩大于等于 60 分的同学的学生编号、学生姓名和平均成绩

    select a.SId, b.Sname, avg(a.score) as 平均成绩
    from sc a inner join Student b
    on a.SId = b.SId
    group by a.SId
    having avg(a.score) > 60;
    

    3. 查询在 SC 表存在成绩的学生信息

    select *
    from student
    where SId in ( select SId from sc where score is not null);
    

    4. 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩 (没成绩的显示

    为 null)

    select a.SId, a.Sname, count(b.CId) as 选课总数, sum(b.score) as 总成绩
    from student a left join sc b
    on a.SId = b.SId
    group by a.SId;
    

    4.1 查有成绩的学生信息

    和3有什么区别

    5. 查询「李」姓老师的数量

    select count(*)
    from teacher
    where Tname like '李%';
    

    6. 查询学过张三老师授课的同学的信息

    -- 1
    select a.*
    from student a right join sc b on a.SId = b.SId right join 
         course c on b.CId = c.CId right join teacher d on c.TId = d.TId
    where d.Tname = '张三';
    
    -- 2
    select s.* 
    from sc LEFT JOIN student s 
    on sc.SId = s.SId
    where CId =(
      select CId 
      from course c 
      where TId =(
           select TId 
           from teacher t 
           where Tname ='张三'));
    

    7. 查询没有学全所有课程的同学的信息

    没有学全=排除学全了的学生剩下的

    select *
    from student
    where SId not in (
          select SId 
          from sc
          group by SId
          having count(distinct(CId)) = (select count(course.CId) from course));
    

    8. 查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息

    select * 
    from student
    where SId IN ( 
        select SId 
        from sc 
        where SId !=01 and 
              CId in( select CId 
              from sc 
              where SId=01));
    

    至少有一门课相同,排除和他没有一门课相同的、有课的学生后剩下的学生

    select *
    from student
    where SId in (select SId from sc where score is not null and SId != '01') and 
          SId not in (select SId from sc where CId not in (select CId from sc where SId = '01'));
    

    9. 查询和" 01 "号的同学学习的课程完全相同的其他同学的信息

    -- 课程数相同的
    select * from student 
    where SId in
        (select SId from
            (select * from sc a where CId in (select CId from sc where SId=01))b
        group by SId
            having count(CId) =(select count(CId) from sc c where SId=01))
        and SId !=01;
    
    -- 2
    select sid
    from sc
    where sid != '01'
    group by sid 
    having group_concat(cid) = (select group_concat(cid) from SC where sid = '01');
    

    group_concat() : https://www.cnblogs.com/rxhuiu/p/9134009.html

    10. 查询没学过"张三"老师讲授的任一门课程的学生姓名

    多层嵌套或者多表联结

    select Sname
    from student
    where SId not in (select SId
                      from sc
                      where CId = (select CId
                                   from course
                                   where TId = (select TId
                                                from teacher
                                                where Tname = '张三'))
                      group by SId);
    
    select Sname
    from student
    where SId not in 
      (select a.SId
       from sc as a inner join course b on a.CId = b.CId
       inner join teacher c on b.TId = c.TId
       where Tname = '张三');
    

    11. 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

    select a.SId, a.Sname, avg(b.score)
    from student a inner join sc b on a.SId = b.SId
    where a.SId in(
        select SId
        from sc
        where score < 60
        group by SId
        having count(*) > 1)
    group by SId;
    

    12. 检索" 01 "课程分数小于 60,按分数降序排列的学生信息

    select a.*
    from student a inner join sc b on a.SId = b.SId
    where b.CId = '01' and b.score < 60
    group by b.SId
    order by b.score desc;
    

    13. 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

    select a.SId, a.CId, a.score, b.avscore
    from sc a left join
      (select SId, avg(score) as avscore
       from sc
       group by SId) b on a.SId = b.SId
    order by avscore desc;
    

    注意,1.多表联结后形成的表; 2.自身联结后形成的表(自交);

    14. 查询各科成绩最高分、最低分和平均分:

    以如下形式显示:

    课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率

    (及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90)

    要求输出课程号和选修人数,查询结果按人数降序排列列,若人数相同,按课程号升序排列

    -- 1
    select a.CId, b.Cname, count(a.SId) as 选修人数, max(a.score) as 最高分, min(score) as 最低分, avg(score) as 平均分, 
           concat( truncate(sum(case when a.score >= 60 then 1 else 0 end)/count(SId)*100,2), '%') as 及格率,
           concat( truncate(sum(case when a.score > 70 and a.score < 80 then 1 else 0 end)/count(SId)*100,2), '%') as 中等率,
           concat( truncate(sum(case when a.score >= 80 and a.score < 90 then 1 else 0 end)/count(SId)*100,2), '%') as 优良率,
           concat( truncate(sum(case when a.score >= 90 then 1 else 0 end)/count(SId)*100,2), '%') as 优良率
    from sc a inner join course b on a.CId = b.CId
    group by a.CId
    order by count(a.SId) desc, a.CId;
    
    -- 2
    select CId, count(SId), max(score), min(score), avg(score),
           sum(及格)/count(SId) as 及格率, 
           sum(中等)/count(SId) as 中等率,
           sum(优良)/count(SId) as 优良率,
           sum(优秀)/count(SId) as 优秀率
    from (select *,
          case when score>=60  then 1 else 0  end as 及格,
          case when  score>=70 and score<80 then 1 else 0  end as 中等 ,
          case when  score>=80 and score<90 then 1 else 0  end as 优良 ,
          case when  score>=90 then 1 else 0  end as 优秀 
         from sc) a 
    group by CId
    order by count(SId) desc, CId
    

    15. 按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺

    https://www.jianshu.com/p/476b52ee4f1b

    15.1 按各科成绩进行行排序,并显示排名, Score 重复时合并名次

    16. 查询学生的总成绩,并进行排名,总分重复时保留名次空缺

    16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺

    17. 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比

    select a.CId, b.Cname,
        sum(case when a.score between 85 and 100 then 1 else 0 end) as '[100-85]人数',
        concat( truncate(sum(case when a.score between 85 and 100 then 1 else 0 end)/count(a.SId)*100,2), '%') as '占比',
        sum(case when a.score < 85 and score >= 70 then 1 else 0 end) as '[85-70]人数',
        concat( truncate(sum(case when a.score < 85 and score >= 70 then 1 else 0 end)/count(a.SId)*100,2), '%') as '占比',
        sum(case when a.score < 70 and score >= 60 then 1 else 0 end) as '[70-60]人数',
        concat( truncate(sum(case when a.score < 70 and score >= 60 then 1 else 0 end)/count(a.SId)*100,2), '%') as '占比',
        sum(case when a.score < 60 then 1 else 0 end) as '[60-0]人数',
        concat( truncate(sum(case when a.score < 60 then 1 else 0 end)/count(a.SId)*100,2), '%') as '占比'
    from sc a inner join course b on a.CId = b.CId
    group by a.CId;
    

    其中

    • case when a.score >=70 then 1 else 0 end可以替换为 if (a.score >=70 , 1, 0);
    • truncate( a, 2)表示将a的小数保留2位;
    • concat(b, '%')表示将两部分合并成一部分;

    18. 查询各科成绩前三名的记录

    各科成绩排名,但是不能显示每组前3条(不能group by 了以后取limit):

    select a.CId, a.score, b.*
    from sc a inner join student b on a.SId = b.SId
    group by a.CId, a.SId
    order by a.CId, a.score desc;
    

    一种是用union(比较繁琐):

    (select a.CId, a.score, b.*
     from sc a inner join student b on a.SId = b.SId
     where CId = 01 order by score desc limit 3)
    union all
    (select a.CId, a.score, b.*
     from sc a inner join student b on a.SId = b.SId
     where CId = 02 order by score desc limit 3)
    union all
    (select a.CId, a.score, b.*
     from sc a inner join student b on a.SId = b.SId
     where CId = 03 order by score desc limit 3);
    

    其他方式,先用自己交自己,条件为a.cid = b.cid and a.score < b.score,其实就是列出同一门课内所有分数比较的情况(https://www.jianshu.com/p/476b52ee4f1b):

    select a.cid, a.sid, a.score
    from sc a left join sc b
    on a.cid = b.cid and a.score < b.score
    group by a.cid, a.sid
    having count(b.cid) < 3
    order by a.cid;
    

    各步骤比较:

    366=108条

    19. 查询每门课程被选修的学生数

    select CId, count(CId)
    from sc 
    group by CId;
    

    20. 查询出只选修两门课程的学生学号和姓名

    -- 多表联结查询
    select a.SId, b.Sname
    from sc a inner join student b on a.SId = b.SId
    group by a.SId
    having count(a.CId) = 2;
    
    -- 嵌套子查询
    select SId,Sname 
    from student
    where SId in (
          select SId from sc
          group by SId
          having count(CId) = 2);
    

    21. 查询男生、女生人数

    select Ssex, count(*)
    from student
    group by Ssex;
    

    22. 查询名字中含有「风」字的学生信息

    select *
    from student
    where Sname like '%风%';
    

    23. 查询同名同性学生名单,并统计同名人数

    select Sname,count(Sname)
    from student 
    group by Sname
    having count(Sname) > 1;
    

    24. 查询 1990 年年出生的学生名单

    select *
    from student
    where Sage like '1990%';
    
    select *
    from student
    where YEAR(student.Sage)=1990;
    

    25. 查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列

    select CId, avg(score)
    from sc
    group by CId
    order by avg(score) desc, CId;
    

    26. 查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩

    嵌套或者联结

    select a.SId, b.Sname, avg(a.score)
    from sc a inner join student b
    on a.SId = b.SId
    group by a.SId
    having avg(a.score)>=85;
    

    27. 查询课程名称为「数学」,且分数低于 60 的学生姓名和分数

    select b.Sname, a.score
    from sc a inner join student b
    on a.SId = b.SId
    where a.score < 60 and 
          a.CId = ( select CId
                    from course
            where Cname = '数学');
    

    28. 查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)

    select a.Sname, a.SId, b.CId, b.score
    from student a left join sc b
    on a.SId =  b.SId;
    

    29. 查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数

    select a.Sname, c.Cname, b.score
    from student a inner join sc b on a.SId =  b.SId
         inner join course c on b.CId = c.CId
    where b.score > 70;
    

    30. 查询不及格的课程

    select CId
    from sc
    where score < 60;
    

    没讲清楚具体的意思(课程名字还是ID)

    31. 查询课程编号为 01 且课程成绩在 80 分及以上的学生的学号和姓名

    -- 子查询/多表联结
    select SId, Sname
    from student
    where SId in
        (select SId
         from sc
         where CId = '01' and score >= 80);
    

    32. 求每门课程的学生人数

    select CId, count(SId) as 选课人数
    from sc
    group by CId;
    

    33. 成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩

    -- 1
    select b.score, a.*
    from student a inner join sc b on a.SId = b.SId 
         inner join course c on c.CId = b.CId
         inner join teacher d on d.TId = c.TId
    where Tname = '张三'
    order by b.score desc
    limit 1;
    
    -- 2
    select a.*, b.score
    from student a inner join sc b on a.SId = b.SId 
         inner join course c on c.CId = b.CId
         inner join teacher d on d.TId = c.TId
    where Tname = '张三'
    having max(b.score);
    

    34. 成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩

    35. 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

    36. 查询每门成绩最好的前两名 (同18题)

    (select a.CId, a.score, b.*
     from sc a inner join student b on a.SId = b.SId
     where CId = 01 order by score desc limit 2)
    union all
    (select a.CId, a.score, b.*
     from sc a inner join student b on a.SId = b.SId
     where CId = 02 order by score desc limit 2)
    union all
    (select a.CId, a.score, b.*
     from sc a inner join student b on a.SId = b.SId
     where CId = 03 order by score desc limit 2);
    

    37. 统计每门课程的学生选修人数(超过 5 人的课程才统计)

    select CId, count(SId) as 选课人数
    from sc
    group by CId
    having count(SId) > 5;
    

    38. 检索至少选修两门课程的学生学号

    select SId
    from sc
    group by SId
    having count(CId) > 1;
    

    39. 查询选修了全部课程的学生信息

    select a.*
    from student a inner join sc b on a.SId = b.SId
    group by b.SId
    having count(b.CId) = (select count(CId) from course);
    

    40. 查询各学生的年龄,只按年份来算

    select SId, Sname, year(Sage) as 出生年份, year(now())-year(Sage) as 年龄
    from student;
    

    41. 按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一

    -- 一般都用这个方法精确到天
    select SId as 学生编号, Sname as 学生姓名, TIMESTAMPDIFF(YEAR, Sage, CURDATE()) as 学生年龄
    from student;
    
    -- 2
    select Sid, Sname,
    case when (DATE_FORMAT(NOW(),'%m-%d')- DATE_FORMAT(Sage,'%m-%d')) <0
    -- 用date()却不行
    then year(now())-year(Sage)-1
    else year(now())-year(Sage) 
    end as 年龄
    from student;
    

    TIMESTAMPDIFF(unit,begin,end)

    TIMESTAMPDIFF函数返回begin-end的结果,其中beginendDATEDATETIME表达式。
    TIMESTAMPDIFF函数允许其参数具有混合类型,例如,beginDATE值,end可以是DATETIME值。 如果使用DATE值,则TIMESTAMPDIFF函数将其视为时间部分为“00:00:00”DATETIME值。
    unit参数是确定(end-begin)的结果的单位,表示为整数。 以下是有效单位:

    • MICROSECOND
    • SECOND
    • MINUTE
    • HOUR
    • DAY
    • WEEK
    • MONTH
    • QUARTER
    • YEAR

    42. 查询本周过生日的学生

    select *
    from student
    where week(Sage) = week(now());
    

    week() 和 weekofyear()的区别:https://www.yiibai.com/sql/sql-weekofyear-function.html

    weekofyear()是一个兼容性函数,它等效于WEEK(date,3)

    sql日期函数: https://www.yiibai.com/sql/sql-date-functions.html

    43. 查询下周过生日的学生

    select *
    from student
    where week(Sage) = week(now())+1;
    

    44. 查询本月过生日的学生

    select *
    from student
    where month(Sage) = month(now());
    

    45. 查询下月过生日的学生

    select *
    from student
    where month(Sage) = month(now())+1;
    

    复购率计算:

    select a.商品ID, 
           count(a.times) as '购买人数', 
           sum(if(a.times >1,1,0)) as '重复购买人数', 
           sum(if(a.times >1,1,0))/count(a.times) as '复购率'
    from (select 商品ID, 用户ID, count(用户ID) as times
          from userbehavior
          where 行为类型 = 'buy'
          group by 商品ID, 用户ID) as a
    group by a.商品ID;
    

    相关文章

      网友评论

          本文标题:SQL50题

          本文链接:https://www.haomeiwen.com/subject/swfmfctx.html