【问题标题】:How do you join a table with a different WHERE condition after you already used a join使用连接后如何连接具有不同 WHERE 条件的表
【发布时间】:2023-03-16 01:05:01
【问题描述】:

您好,我有 2 张员工表和通过员工 ID 关联的病假,基本上我想创建一个结果集,其中有一列按月和年过滤,另一列仅按年过滤

       EMPLOYEES                  MEDICAL
    |employee|ID|             |ID|DateOfLeave|
         A     1                1   2019/1/3
         B     2                1   2019/4/15
         C     3                2   2019/5/16
         D     4


    select employees.employee,Employees.ID,count(medical.dateofleave) as 
    NumberofLeaves
    from employees 
    left outer join Medical on employees.emp = MedBillInfo.emp
    and month(medbillinfo.date) in(1) and year(medbillinfo.date) in (2019)
    group by Employees.employee,employees.ID




           RESULT SET
    |Employee|ID|NumberOfLeaves|YearlyLeaves|--i want to join this column
        A      1      1              2
        B      2      0              1
        C      3      0              0
        D      4      0              0

但我不知道如何在当前的 sql 语句中编写以将年假列加入我当前的结果集,该结果集只有员工、id 和 numberofleaves

【问题讨论】:

  • 您通常 GROUP BY 与您选择的列相同,但那些作为设置函数的参数的列除外。试试group by employees.employee, Employees.ID
  • 顺便说一句,您订购了一个未知的列!?!
  • @jarlh 糟糕,该语句最初是针对我的其他数据库的,我只是对其进行了编辑以适应上面的示例数据库,忘记编辑底部行

标签: sql sql-server


【解决方案1】:

我想你想要条件聚合:

select e.employee, e.ID,
       count(*) as num_leaves,
       sum(case when month(m.date) = 1 then 1 else 0 end) as num_leaves_in_month_1
from employees e left join
     Medical m
     on e.emp = m.emp
where m.date >= '2019-01-01' and m.date < '2020-01-01'
group by e.employee, e.ID;

注意事项:

  • 这会删除似乎引用不存在的表别名的where 子句。
  • 日期算术使用直接比较而不是函数。
  • 这引入了表别名,因此问题更易于编写和阅读。

【讨论】:

  • 哦,我明白了,谢谢,但就我而言,我将不得不删除 where 子句,因为我的数据最终将在 2020 年添加,并且我希望能够灵活地选择哪个我想看的年假。请问与函数相比,直接比较日期是否有优势?
  • @guyguy 。 . .优化器更容易理解直接比较。它们还允许优化器利用这些列上的分区和索引。
【解决方案2】:

您的问题可能需要更正,因为分组条件与选择列不匹配。但是根据您的要求,我认为您需要使用截断日期功能才能按年份对叶子进行分组。对于 SQL Server,有 YEAR(date) 函数返回给定日期的年份。在您的情况下,此日期为 MEDICAL.DateOfLeave。

【讨论】:

  • 哎呀,谢谢提醒,该语句最初是为我的其他数据库准备的,我只是对其进行了编辑以适应上面的示例数据库,忘记编辑底部行
猜你喜欢
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 2016-08-31
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
相关资源
最近更新 更多