【问题标题】:Conditional COUNT in SQL with table JoinSQL中的条件COUNT与表连接
【发布时间】:2021-03-29 15:38:33
【问题描述】:

我有这个问题:

SQL> SELECT DISTINCT Module.module_name, Instructor.Instructor_name
  2  FROM InstructorMailingAddressModPer
  3  JOIN Module ON InstructorMailingAddressModPer.module_id = Module.module_id
  4  JOIN Instructor ON InstructorMailingAddressModPer.instructor_id = Instructor.instructor_id
  5  ORDER BY module_name;

结果如下表:

我正在尝试仅显示多个讲师的结果,例如针对经理、数据库等的模块名称的会计和财务

我想出了以下查询但搞砸了,这个查询只是为了说明我的思考过程:

SELECT Module.module_name, Instructor.Instructor_name
  2  FROM (
  3     SELECT Module.module_name, Instructor.Instructor_name
  4     COUNT(DISTINCT InstructorMailingAddressModPer.module_id) CNT
  5     FROM InstructorMailingAddressModPer
  6     JOIN Instructor ON InstructorMailingAddressModPer.instructor_id = Instructor.instructor_id
  7     JOIN Module ON InstructorMailingAddressModPer.module_id = Module.module_id
  8  WHERE CNT > 1;

【问题讨论】:

  • 分享预期输出

标签: sql oracle join count


【解决方案1】:

-- 示例表和数据

create table modules (module_name varchar2(10), instructor_name varchar2(10));
 insert into modules  values ('A1' , 'Smith');
 insert into modules  values ('A1' , 'Doe');
 insert into modules  values ('A2' , 'Smith');
 insert into modules  values ('A3' , 'Smith');
 insert into modules  values ('A2' , 'Smith');
 insert into modules  values ('A1' , 'Smith');

-- 您可以使用分析函数或仅分组。

select * from modules where module_name in (
 select module_name
 from modules
 group by module_name
 having count(distinct instructor_name) >1 );

select distinct module_name, instructor_name , cnt from 
(select module_name, instructor_name , count(distinct instructor_name)over( partition by module_name) cnt
 from modules) 
where cnt > 1;

【讨论】:

    【解决方案2】:

    一种方法是窗口函数:

    SELECT module_name, Instructor_name, cnt
    FROM (SELECT m.module_name, i.Instructor_name,
                 COUNT(*) OVER (PARTITION BY m.module_name) as cnt
          FROM InstructorMailingAddressModPer ima JOIN
               Module m
               ON ima.module_id = m.module_id JOIN
               Instructor i
               ON ima.instructor_id = i.instructor_id
         ) mi
    WHERE cnt > 1
    ORDER BY module_name;
    

    【讨论】:

    • 这给出了所有的值并且不做分区计数。你有机会再看一遍吗?我认为也许 count(*) 是问题所在,并且也尝试过使用 module_name,但是如果不包含 DISTINCT,它总是会在上面的查询中给出整个结果
    • @SamitPaudel 看起来您可以将cnt 添加到外部查询的select 列表中。
    • @SamitPaudel 。 . .这不在您的问题中,但很容易从子查询中包含在内。
    猜你喜欢
    • 1970-01-01
    • 2020-06-19
    • 2013-08-13
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多