1

範囲内のテーブルから値を選択したい。このようなもの:

SELECT
  date_values.date_from,
  date_values.date_to,
  sum(values.value)
FROM values
  inner join date_values on values.id_date = date_values.id
  inner join date_units on date_values.id_unit = date_units.id
WHERE
  date_values.date_from >= '14.1.2012' AND
  date_values.date_to <= '30.1.2012' AND
  date_units.id = 4
GROUP BY
  date_values.date_from,
  date_values.date_to
ORDER BY
  date_values.date_from,
  date_values.date_to;

しかし、このクエリは、任意の値である日の範囲のみを返します。このような:

14.01.12    15.01.12    66
15.01.12    16.01.12    4
17.01.12    18.01.12    8
...etc

(ここでは 16.01.12 から 17.01.12 が欠落しています)

しかし、次のように欠損値も選択したい:

14.01.12    15.01.12    66
15.01.12    16.01.12    4
16.01.12    17.01.12    0
17.01.12    18.01.12    8
...etc

私は PL/SQL を使用できません。時間、月、年で使用できるように拡張できる、より一般的なソリューションをアドバイスしていただけないでしょうか。素晴らしいでしょう。

4

1 に答える 1

2

私はあなたが提供していると仮定するつもりですdate_fromそしてdate_to。その場合は、最初に日付のリストを生成してから、それに参加して残りの結果を取得できます。または、テーブルunionに対してこのクエリを実行することもできます。これにより、余分なデータが削除されます。date_valuesunion

これが日付のリストが生成される方法である場合:

 select to_date('14.1.2012','dd.mm.yyyy') + level - 1 as date_from
      , to_date('14.1.2012','dd.mm.yyyy') + level as date_to
   from dual
connect by level <= to_date('30.1.2012','dd.mm.yyyy') 
                  - to_date('14.1.2012','dd.mm.yyyy')

あなたのクエリは

with the_dates as (
 select to_date('14.1.2012','dd.mm.yyyy') + level - 1 as date_from
      , to_date('14.1.2012','dd.mm.yyyy') + level as date_to
   from dual
connect by level <= to_date('30.1.2012','dd.mm.yyyy') 
                  - to_date('14.1.2012','dd.mm.yyyy')
         )
SELECT
  dv.date_from,
  dv.date_to,
  sum(values.value)
FROM values
  inner join ( select the_dates.date_from, the_dates.date_to, date_values.id
                 from the_dates
                 left outer join date_values
                   on the_dates.date_from = date_values.date_from ) dv
     on values.id_date = dv.id
  inner join date_units on date_values.id_unit = date_units.id
WHERE
  date_units.id = 4
GROUP BY
  dv.date_from,
  dv.date_to
ORDER BY
  dv.date_from,
  dv.date_to;

with構文はサブクエリファクタリングと呼ばれ、この場合は実際には必要ありませんが、コードがよりクリーンになります。

dateまた、の列はdate_values日付であると想定しました。文字列の比較を行っているので、それは明らかではありません。該当する場合は常に明示的に日付に変換する必要があり、常に日付を日付として保存する必要があります。物事が間違って入力されたり、間違って比較されたりすることが不可能であるため、長期的には多くの手間を省くことができます。

于 2012-06-08T09:41:26.340 に答える