SQL:如何通过某些列的值将表中的 'split' 行?

标签 sql sql-server database tsql select

<分区>

我有一个表格,其中包含这样的行:

Name  | date_from  | date_to    | age
------+------------+------------+-----
Alice | 01.12.2004 | 03.04.2008 | 35
Bob   | 04.02.2013 | 04.11.2014 | 43

我想制作一个表格,将每一行分成一年的时间间隔 date_fromdate_to 列,保留 Name,并更新 age,如下所示:

Name  | date_from  | date_to    | age
------+------------+------------+-----
Alice | 01.12.2004 | 01.12.2005 | 35
Alice | 01.12.2005 | 01.12.2006 | 36
Alice | 01.12.2006 | 01.12.2007 | 37
Alice | 01.12.2007 | 01.12.2008 | 38
Alice | 01.12.2008 | 03.04.2008 | 39
Bob   | 04.02.2013 | 04.02.2014 | 43
Bob   | 04.02.2014 | 04.11.2014 | 44

这可以用 SQL 实现吗?

最佳答案

一个解决方案是生成一个数字列表并将其与原始表格连接起来,将开始日期加上年数直到达到结束日期。

以下查询最多处理 5 年(要支持更多年,您需要使用更多 VALUES 扩展子查询)

SELECT
    name, 
    DATEADD(year, x.n, t.date_from) date_from,
    CASE 
        WHEN DATEADD(year, x.n + 1, t.date_from) > t.date_to 
        THEN date_to 
        ELSE DATEADD(year, x.n + 1, t.date_from) 
    END date_to,
    t.age + x.n age
FROM 
    mytable t
    INNER JOIN (
        VALUES(0), (1), (2), (3), (4), (5)
    ) x(n) ON DATEADD(year, x.n, t.date_from) <= t.date_to
ORDER BY name, age

这个 demo on DB Fiddle 您的示例数据返回:

name  | date_from           | date_to             | age
:---- | :------------------ | :------------------ | --:
Alice | 01/12/2004 00:00:00 | 01/12/2005 00:00:00 |  35
Alice | 01/12/2005 00:00:00 | 01/12/2006 00:00:00 |  36
Alice | 01/12/2006 00:00:00 | 01/12/2007 00:00:00 |  37
Alice | 01/12/2007 00:00:00 | 03/04/2008 00:00:00 |  38
Bob   | 04/02/2013 00:00:00 | 04/02/2014 00:00:00 |  43
Bob   | 04/02/2014 00:00:00 | 04/11/2014 00:00:00 |  44

关于SQL:如何通过某些列的值将表中的 'split' 行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57753538/

相关文章:

mysql - 如何在 Mysql 中计算 Count(*) 的总和

sql-server - SSIS 表达式中的拆分函数

mysql - 重新使用sql server中现有的选定列?

PHP MYSQL - 插入不使用列名但使用自动增量字段

php - 无法在centos 7中使用php连接postgres数据库

mysql - SQL 出现次数,汇总查询

mysql - 获取同一个表中的百分比

c# - 使用 C# Windows 窗体应用程序将数据从 Excel (.CSV) 文件上传到 SQL

java - 结果集.next() : Does it fetch data from buffer OR from database?

sql - 使用同一表中的值更新行