如何将静态转换为动态函数/过程或查询

时间:2018-02-14 11:18:51

标签: sql oracle plsql

DESIRE O/P LINK WHICH I EXPECT PLEASE CLICK THIS SCREENSHOOT.PNG我创建了以下静态查询

SELECT '1' AS KPI_ID,
       'P2P' AS KPI_DESC,
       '22-MAR-17' AS dates,
       (SUM (
           CASE
              WHEN S_DATE BETWEEN ADD_MONTHS ('22-MAR-17', 0) - 13
                              AND ADD_MONTHS ('22-MAR-17', 0) - 7
              THEN
                 VOLUME
              ELSE
                 0
           END))
          LAST_WEEK_Volume,
       (SUM (
           CASE
              WHEN S_DATE BETWEEN ADD_MONTHS ('22-MAR-17', 0) - 6
                              AND ADD_MONTHS ('22-MAR-17', 0)
              THEN
                 VOLUME
              ELSE
                 0
           END))
          THIS_WEEK_Volume
  FROM TABLE

问题陈述

其实我有两年的数据..

我想要计算上周的数量,当前一周的数量为2天。

那么我应该在查询中修改什么才能获得动态查询。

当前查询仅提供1天计算。

我想每天做明智的计算。

根据谷歌我发现,在定义参数start_dateend_date并传递到列之后,它是可能的,但我不知道什么是对或错?

请你帮帮我吗?

2 个答案:

答案 0 :(得分:0)

什么是"动态"在这个查询?似乎是' 22-MAR-17' (周三)。

因此,如果您通过其他日期,您将获得不同的结果。怎么通过呢?使用变量。在标记SQL Developer时,您使用:param_name语法(参数名称以冒号开头),例如

select count(*) from emp where deptno = :par_deptno

如果它是PL / SQL(是吗?怎么样?),那么它是什么类型的PL / SQL?如果是匿名阻止,您可以使用与上述相同的原则(即:param_name)。如果是一个过程,您宁愿创建一个参数并将值传递给它。

答案 1 :(得分:0)

您可以尝试这样的事情:

with dates_table as (
                 SELECT to_date(:begin_date, 'dd/mm/yyyy') + ROWNUM - 1 c_date
                        FROM dual
                  CONNECT BY LEVEL <= to_date(:end_date, 'dd/mm/yyyy') - to_date(:begin_date, 'dd/mm/yyyy') + 1)
    SELECT '1' AS KPI_ID,
           'P2P' AS KPI_DESC,
           c_date AS dates,
           (SUM (
               CASE
                  WHEN S_DATE BETWEEN ADD_MONTHS (c_date, 0) - 13
                                  AND ADD_MONTHS (c_date, 0) - 7
                  THEN
                     VOLUME
                  ELSE
                     0
               END))
              LAST_WEEK_Volume,
           (SUM (
               CASE
                  WHEN S_DATE BETWEEN ADD_MONTHS (c_date, 0) - 6
                                  AND ADD_MONTHS (c_date, 0)
                  THEN
                     VOLUME
                  ELSE
                     0
               END))
              THIS_WEEK_Volume
      FROM TABLE, dates_table

此处dates_table将包含begin_dateend_date之间的所有日期(作为行)。因此,我们将您的&#39;静态&#39;加入该表格。查询以获得所需的结果。