0

ユーザーが開始日と終了日を入力するクエリがあります。

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  |

または、四半期末に一致するすべての日付を返す必要があります。結果は次のようになります。

|    DATE    |  VALUE  |
| 30/09/2012 |   1.25  |

また、元のテーブルのすべてのデータを返すだけの 3 番目のオプションも必要です。

助けてください。

ありがとう

4

1 に答える 1

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
于 2012-11-22T15:59:01.167 に答える