【发布时间】:2021-10-10 13:03:44
【问题描述】:
所以我可能会被一些非常琐碎的事情困住,但无法弄清楚如何让它发挥作用。我创建了 2 个在 SQL 中工作的代码块,但在 Oracle SQL 中的日期变量声明存在一些问题。
我在创建这些代码时拥有对 SQL 数据库的写入权限,因此我执行了“插入”来创建临时表。我没有写权限了。所以我正在使用 CTE。
原始代码如下所示:
DECLARE @Startdate Datetime = '2021-Jun-01 00:00:00.000'
DECLARE @Enddate Datetime = '2021-Jun-30 00:00:00.000'
Insert into Temp1
select ...
from ...
WHILE Startdate <= Enddate
BEGIN
Insert into Temp2
select ...
from (Temp 1)
left join
select ...
set @startdate=dateadd(d,1,@startdate)
end;
使用我的新代码,我做了以下调整:
VARIABLE Startdate Datetime = '2021-Jun-01 00:00:00.000'
VARIABLE Enddate Datetime = '2021-Jun-30 00:00:00.000'
EXEC :Startdate := '2021-Jun-30 00:00:00.000'
EXEC :Enddate := '2021-Jun-30 00:00:00.000'
WITH Temp1 as (
select ...
from ...),
/* Unsure about using WHILE with with 2 CTEs so removing them for now but will need to be added*/
WITH Temp2 as
select ...
from (Temp 1)
left join
select ...
set startdate = :startdate + 1
end)
select * from Temp2;
这两个代码块可以完美地单独工作。我认为我的担忧在于以下一项或全部:
- 变量声明 - 我阅读了几篇 stackoverflow 帖子,似乎有绑定变量和替换变量。有没有其他声明变量的方法?
- 2 个 CTE 之间的 WHILE 循环。我们可以做一个while循环作为CTE吗? (与此类似)create while loop with cte
- 如何增加日期。这是在 Oracle PL/SQL 中增加日期的正确方法吗?
任何指导都会有所帮助。
另外加2块代码供参考:
表格详情:
交易 - 包含交易信息。 Execution Date 是事务执行的时间戳
帐户 - 包含帐户信息,每个帐户都有一个唯一的 Account_Key
Code_Rel - 将交易代码映射到交易类型
Group Rel - 将事务类型映射到事务组
/***Block 1 of Code***/
insert into Temp1
select
a.ACCOUNT_KEY
,a.SPG_CD
,t.EXECUTION_DATE
from Schema_Name.TRANSACTIONS t
inner join Schema_Name.ACCOUNT a on a.en_sk=t.ac_sk
inner join Schema_Name.Code_Rel tr on t.t_cd_s = tr.t_cd_s
inner join ( select * from Schema_Name.Group_Rel
where gtrt_cd in ('Type1','Type2')) tt on tr.trt_cd = tt.trt_cd
where t.EXECUTION_DATE >= @startdate and t.EXECUTION_DATE<=@EndDt
and tt.gtrt_cd in ('Type1','Type2')
group by a.ACCOUNT_KEY ,a.SPG_CD, t.EXECUTION_DATE;
/***WHILE LOOP***/
while @startdate <= @EndDt
BEGIN
/***INSERT AND BLOCK 2 OF CODE***/
insert into Temp2
select table1.account_key, table1.SPG_CD, @startdate, coalesce(table2.sum_tr1,0),coalesce(table3.sum_tr2,0),
case when coalesce(table3.sum_tr2,0)>0 THEN coalesce(table2.sum_tr1,0)/coalesce(table3.sum_tr2,0) ELSE 0 END,
case when coalesce(table3.sum_tr2,0)>0 THEN
CASE WHEN coalesce(table2.sum_tr1,0)/coalesce(table3.sum_tr2,0)>=0.9 and coalesce(table2.sum_tr1,0)/coalesce(table3.sum_tr2,0)<=1.10 and coalesce(table2.sum_tr1,0)>=1000 THEN 'Yes' else 'No' END
ELSE 'No' END
FROM ( SELECT * FROM Temp1 WHERE execution_date=@startdate) TABLE1 LEFT JOIN
(
select a.account_key,a.SPG_CD, SUM(t.AC_Amt) as sum_tr1
from Schema_Name.TRANSACTIONS t
inner join Schema_Name.ACCOUNT a on a.en_sk=t.ac_sk
inner join Schema_Name.Code_Rel tr on t.t_cd_s = tr.t_cd_s
inner join ( select * from Schema_Name.Group_Rel
where gtrt_cd in ('Type1')) tt on tr.trt_cd = tt.trt_cd
where t.EXECUTION_DATE <= @startdate
and t.EXECUTION_DATE >=dateadd(day,-6,@startdate)
and tt.gtrt_cd in ('Type1')
group by a.account_key, a.SPG_CD
) table2 ON table1.account_key=table2.account_key
LEFT JOIN
(
select a.account_key,a.SPG_CD, SUM(t.AC_Amt) as sum_tr2
from Schema_Name.TRANSACTIONS t
inner join Schema_Name.ACCOUNT a on a.en_sk=t.ac_sk
inner join Schema_Name.Code_Rel tr on t.t_cd_s = tr.t_cd_s
inner join ( select * from Schema_Name.Group_Rel
where gtrt_cd in ('Type2')) tt on tr.trt_cd = tt.trt_cd
where t.EXECUTION_DATE <= @startdate
and t.EXECUTION_DATE >=dateadd(day,-6,@startdate)
and tt.gtrt_cd in ('Type2')
group by a.account_key, a.SPG_CD ) table3 on table1.account_key=table3.account_key
where coalesce(table2.sum_tr1,0)>=1000
set @startdate=dateadd(d,1,@startdate)
end;
【问题讨论】:
标签: sql plsql while-loop common-table-expression