我有一个查询,其中用户输入开始和结束日期。
AND PP.PATTR_CALCUL_DATE >= '31 JUN 2012'
AND PP.PATTR_CALCUL_DATE <= '30 SEP 2012'
查询返回如下数据:
| DATE | VALUE |
| 01/07/2012 | 1.25 |
| 31/07/2012 | 2.25 |
| 05/09/2012 | 1.75 |
| 22/08/2012 | 3.99 |
| 30/09/2012 | 1.25 |
| 31/08/2012 | 6.37 |
根据用户定义的变量,查询要么返回指定范围内与月末对齐的所有日期。 所以这个例子的结果是:
| DATE | VALUE |
| 31/07/2012 | 2.25 |
| 30/09/2012 | 1.25 |
| 31/08/2012 | 6.37 |
或者它需要返回与Quarter end对齐的所有日期。 结果如下:
| DATE | VALUE |
| 30/09/2012 | 1.25 |
他们还需要第三个选项,它只返回原始表中的所有数据
请欣赏任何帮助。
由于
答案 0 :(得分:1)
您可以创建一个基于参数更改的条件:
/* with :param = 'date' */
SQL> WITH data AS (
2 SELECT to_date('01/07/2012', 'dd/mm/yyyy') dat, 1.25 value FROM DUAL
3 UNION ALL SELECT to_date('31/07/2012', 'dd/mm/yyyy'), 2.25 FROM DUAL
4 UNION ALL SELECT to_date('05/09/2012', 'dd/mm/yyyy'), 1.75 FROM DUAL
5 UNION ALL SELECT to_date('22/08/2012', 'dd/mm/yyyy'), 3.99 FROM DUAL
6 UNION ALL SELECT to_date('30/09/2012', 'dd/mm/yyyy'), 1.25 FROM DUAL
7 UNION ALL SELECT to_date('31/08/2012', 'dd/mm/yyyy'), 6.37 FROM DUAL
8 )
9 SELECT dat,
10 value
11 FROM data
12 WHERE dat = CASE :param
13 WHEN 'date' THEN dat
14 WHEN 'month' THEN last_day(dat)
15 WHEN 'quarter' THEN add_months(trunc(dat, 'q'), 3) - 1
16 END;
DAT VALUE
----------- ----------
01/07/2012 1,25
31/07/2012 2,25
05/09/2012 1,75
22/08/2012 3,99
30/09/2012 1,25
31/08/2012 6,37
/* with :param = 'month' */
DAT VALUE
----------- ----------
31/07/2012 2,25
30/09/2012 1,25
31/08/2012 6,37
/* with :param = 'quarter' */
DAT VALUE
----------- ----------
30/09/2012 1,25