在DB2 SQL中使用存储过程/宏进行声明和循环

jvlzgdj9  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(179)

我有一个表_A,它的名称和交货日期如下所示
| 名称名称名称|删除(_D)|
| - -|- -|
| 标记|2022年4月1日|
| 标记|2022年4月3日|
| 标记|2022年4月5日|
| 标记|2022年4月7日|
| 标记|2022年4月9日|
| 戴夫|2022年4月2日|
| 戴夫|2022年4月4日|
| 戴夫|2022年4月6日|
| 戴夫|2022年4月8日|
| 戴夫|2022年4月10日|
等等。我想要一个到特定日期为止的名称的累积计数。例如,从2022-04-07到2022-04-10的输出样本
| 日期|名称名称名称|剪切计数|
| - -|- -|- -|
| 2022年4月7日|标记|四个|
| 2022年4月8日|标记|四个|
| 2022年4月9日|标记|五个|
| 2022年4月10日|标记|五个|
| 2022年4月7日|戴夫|三个|
| 2022年4月8日|戴夫|四个|
| 2022年4月9日|戴夫|四个|
| 2022年4月10日|戴夫|五个|
Ofc的日期可以是不同名称的公共。我正在尝试使用动态SQL(因为我是一个初学者,并希望探索更多)。我已经生成了以下代码的基础上,我可以找到关于动态SQL方法。我也开放其他方法太多。

begin
    declare cur_date date;
    declare og_date date;
    declare Cust_Name varchar2(4);
    declare cul_cnt number;
    set cur_date = current_date; /*today's date*/
    set og_date = cur_date - 10; /*calculating cumulative counts for last 10 days*/
loop
    select Name,count(Name) into Cust_Name,cul_cnt,og_date
    from table_A
    where prod_type like 'SHOES' /*Another column in the table just for filter*/
    and Del_dt <= og_date
    group by Name;
    og_date = og_date + 1;
exit when (og_date > cur_date);
end;
end;

目前我收到此错误

Error report -
Error starting at line : 1 in command -
DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=CUR_DATE;SECTION, DRIVER=3.69.49

但是,我确信代码中会有更多的错误。如何才能获得Output表中显示的所需输出?还有,如何才能获得og_date(输出中的Date列),因为它不在原始表_A中,而是一个定义的变量

laawzig2

laawzig21#

试试看:

WITH 
-- Table of 10 dates generation starting from 2022-04-10
-- CURRENT_DATE can be used instead   
  D (I, DT) AS 
(
  SELECT 1, DATE ('2022-04-10') FROM SYSIBM.SYSDUMMY1
    UNION ALL
  SELECT I + 1, DT - 1 DAY FROM D WHERE I < 10
)
/*
, table_A (Name, Del_dt) AS 
(
          SELECT 'Mark', DATE ('2022-04-01') FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'Mark', DATE ('2022-04-03') FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'Mark', DATE ('2022-04-05') FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'Mark', DATE ('2022-04-07') FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'Mark', DATE ('2022-04-09') FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'Dave', DATE ('2022-04-02') FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'Dave', DATE ('2022-04-04') FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'Dave', DATE ('2022-04-06') FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'Dave', DATE ('2022-04-08') FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT 'Dave', DATE ('2022-04-10') FROM SYSIBM.SYSDUMMY1
)

* /

SELECT D.DT, A.Name, A.cul_cnt
FROM D
CROSS JOIN TABLE 
(
  SELECT A.Name, COUNT (1) cul_cnt
  FROM table_A A
  WHERE A.Del_dt <= D.DT
  GROUP BY A.Name
) A
WHERE DT BETWEEN DATE ('2022-04-07') AND DATE ('2022-04-10')
ORDER BY A.Name DESC, D.DT

如果取消注解掉的块的注解,则可以按原样运行该语句。在这种情况下,结果与您的结果相同:
| 数据传输|名称|累积计数|
| - -|- -|- -|
| 2022年4月7日|标记|四个|
| 2022年4月8日|标记|四个|
| 2022年4月9日|标记|五个|
| 2022年4月10日|标记|五个|
| 2022年4月7日|戴夫|三个|
| 2022年4月8日|戴夫|四个|
| 2022年4月9日|戴夫|四个|
| 2022年4月10日|戴夫|五个|
Oracle中的相同查询:

WITH
  D (I, DT) AS 
(
  SELECT 1, TO_DATE ('2022-04-10', 'YYYY-MM-DD') FROM DUAL
    UNION ALL
 SELECT I + 1, DT - INTERVAL '1' DAY FROM D WHERE I < 10
)
/*
, table_A (Name, Del_dt) AS 
(
          SELECT 'Mark', TO_DATE ('2022-04-01', 'YYYY-MM-DD') FROM DUAL
UNION ALL SELECT 'Mark', TO_DATE ('2022-04-03', 'YYYY-MM-DD') FROM DUAL
UNION ALL SELECT 'Mark', TO_DATE ('2022-04-05', 'YYYY-MM-DD') FROM DUAL
UNION ALL SELECT 'Mark', TO_DATE ('2022-04-07', 'YYYY-MM-DD') FROM DUAL
UNION ALL SELECT 'Mark', TO_DATE ('2022-04-09', 'YYYY-MM-DD') FROM DUAL
UNION ALL SELECT 'Dave', TO_DATE ('2022-04-02', 'YYYY-MM-DD') FROM DUAL
UNION ALL SELECT 'Dave', TO_DATE ('2022-04-04', 'YYYY-MM-DD') FROM DUAL
UNION ALL SELECT 'Dave', TO_DATE ('2022-04-06', 'YYYY-MM-DD') FROM DUAL
UNION ALL SELECT 'Dave', TO_DATE ('2022-04-08', 'YYYY-MM-DD') FROM DUAL
UNION ALL SELECT 'Dave', TO_DATE ('2022-04-10', 'YYYY-MM-DD') FROM DUAL
)

* /

SELECT TO_CHAR (D.DT, 'YYYY-MM-DD') DT, A.Name, A.cul_cnt
FROM D
CROSS JOIN LATERAL 
(
  SELECT A.Name, COUNT (1) cul_cnt
  FROM table_A A
  WHERE A.Del_dt <= D.DT
  GROUP BY A.Name
) A
WHERE D.DT BETWEEN TO_DATE ('2022-04-07', 'YYYY-MM-DD') AND TO_DATE ('2022-04-10', 'YYYY-MM-DD')
ORDER BY A.Name DESC, D.DT

相关问题