SQL - 逐年查询

Posted

技术标签:

【中文标题】SQL - 逐年查询【英文标题】:SQL - Query Year by Year 【发布时间】:2021-03-30 08:38:15 【问题描述】:

我有一张员工信息表,包括他们的工作开始和结束日期。我想提取过去十年来在公司工作一整年、年复一年的员工名单。

因此,例如,如果我想获取整个 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|

【问题讨论】:

您能给我们展示一些示例表数据和预期结果吗? (作为格式化文本,没有图像。) 感谢提醒,已在详情中添加 你不想给 John 6 行吗? (2010, 2011, 2012, 2013, 2014, 2015) 确实如此。 5行,从2010年到2014年(2009年入职,2015年离职,这两年全年不在公司)。我只是展示了我想要的 2010 年和 2011 年输出的示例 【参考方案1】:

你可以使用:

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 ) )

【讨论】:

如果一个人没有离开组织,那么结束日期可能为空,所以可能需要coalesce(e.employment_end_date, current_date) &gt;= ... 之类的东西 @PaulMaxwell 这是可能的,但它不是 OP 原始查询的一部分,所以我假设他们不需要。【参考方案2】:

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
)

【讨论】:

以上是关于SQL - 逐年查询的主要内容,如果未能解决你的问题,请参考以下文章

基于android的校园快递查询收取寄件app

SQL查询语句

使用sql语句查询日期的方法

怎么用sql语句查询?

SQL查询语句

sql查询语句?