微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL - 逐年查询

如何解决SQL - 逐年查询

我有一张员工信息表,包括他们的工作开始和结束日期。我想提取一份过去十年中全年、逐年、在公司工作的员工列表。

例如,如果我想获取 2010 年全年在公司工作的员工列表,我将执行如下查询

SELECT employee_name FROM employees
WHERE employment_start_date < DATE '2010-01-01'
AND employment_end_date > DATE '2010-12-31'

现在,我可以从 2010 年到 2020 年每年手动重复此过程 10 次(并手动将相关年份附加为附加列),但肯定有一种更简单的方法可以使用单个 sql 查询执行此操作吗?

>

更多背景信息: 我实际上是在尝试将我的 Cypher 查询直接转换为 sql 查询(因为不同的公司使用不同的数据库系统)。使用 Cypher,我会这样做:

WITH [2010,2011,2012,...,2019,2020] AS years
UNWIND years as y
MATCH (e:employees)
WHERE e.employment_start_date.year < y
AND e.employment_end_date.year > y
RETURN y,e.employee_name

所以我正在尝试为此找到一个等效的 sql


示例表数据:

|employee_name|employment_start_date|employment_end_date|
|:---:|:---:|:---:|
|John|2009-06-01|2015-03-02|
|Mary|2010-04-02|2014-03-07|
|Joseph|2011-03-02|2011-07-03|
|Stephen|2003-06-14|2011-03-07|
|Dew|2010-06-02|2012-02-06|

预期结果:

|Year|employee_name|
|:---:|:---:|
|2010|John|
|2010|Stephen|
|2011|John|
|2011|Mary|
|2011|Dew|

解决方法

您可以使用:

WITH years ( year ) AS (
  SELECT DATE '2010-01-01' FROM DUAL
UNION ALL
  SELECT ADD_MONTHS( year,12 )
  FROM   years
  WHERE  year < DATE '2020-01-01'
)
SELECT y.year,e.employee_name
FROM   employees e
       INNER JOIN years y
       ON (   e.employment_start_date <= y.year
          AND e.employment_end_date   >=  ADD_MONTHS( y.year,12 ) )
,

MT0 建议的替代方案:

WITH years (year) AS(
SELECT EXTRACT (YEAR FROM DATE '2010-01-01') + ROWNUM -1 AS "YEAR"
FROM dual
CONNECT BY ROWNUM <=10
)

SELECT y.year,e.employee_name
FROM employee e
INNER JOIN years y
ON (
EXTRACT(YEAR FROM employment_start_date) < y.year
AND EXTRACT(YEAR FROM employment_end_date) > y.year
)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。