首页 > 解决方案 > 编写 T-SQL 脚本以返回所需的结果

问题描述

我很难编写一个 T-SQL 脚本来返回所需的结果。

这是我的数据:

在此处输入图像描述

所需的结果是这样的:

在此处输入图像描述

这是我针对此结果的 Oracle 脚本:

CREATE TABLE t 
(
    contract_no  VARCHAR2(100),
    begin_date   DATE,
    end_date     DATE
);

INSERT INTO t VALUES ('AAA',to_date('22-12-2020','DD-MM-YYYY'),to_date('13-05-2021','DD-MM-YYYY'));
INSERT INTO t VALUES ('BBB',to_date('20-03-2019','DD-MM-YYYY'),to_date('01-06-2019','DD-MM-YYYY'));

SELECT *
FROM t;

select contract_no
       , begin_date
       , end_date
       , l
       , last_day(add_months(trunc(begin_date,'MONTH'),l-1))
from t, lateral (select level l 
                 from dual 
                 connect by level <= round(months_between(last_day(end_date),trunc(begin_date,'MONTH')))-1);

我需要 T-SQL 中的等效脚本。

提前致谢

标签: sqlsql-serveroracle

解决方案


我会在两个数据库中使用递归 CTE。在 SQL Server 中,这看起来像:

with cte as (
      select contract_no, begin_date, end_date, eomonth(begin_date) as date
      from t
      union all
      select contract_no, begin_date, end_date, eomonth(date, 1) as date
      from cte
      where date < eomonth(end_date, -1)
     )
select *
from cte;

递归 CTE 的语法在 Oracle 中略有不同。

是一个 db<>fiddle。


推荐阅读