2016-04-26 16 views
1

2つの表を比較してOracle Apexで対話型レポートを生成する必要があります。各テーブルには、日付、タグ、番号の列があります。日付が存在しない場合のApexでのSQLクエリ前の日付からの戻り値

表1:Column:Numberの変更の履歴と、column:Numberが変更された日付を書き込みます。

表2:また、列:数値と列:日付(列:列の異なる値を示す日付:月の異なる日付の数値)。

表1と表2の間の "Tag_id"列を比較するとレポートが生成されるので、表1の列:numberは表2の列:numberを参照しています。 .tag = table2.tag)。

表2は、毎月の列番号: を含み、表1は、1,2,3またはそれ以上の日ごとに1回column:numberで変更された日付を含む。

レポートには、表1の列番号の値を表示し、列番号の数値は表2から、表1と表2を列:日付で比較しながら示します。

問題は、表1に列の日付がない場合です。日付:列の日付:表2の日付と同じですが、Databaseは生成されたレポートで返されるcolumn:Numberの値を認識しません。

達成したいこと:列に日付の一致がない場合:表1と表2の間の日付 の表2の列番号の数値をApexのGeneratedレポートに返します。一致するものがない日付*およびSQLクエリのみを使用して最も近い前の日付の表1のcolumn:Numberの値。

tables

+0

、レポート結果の最初の行、値のVORのnumberT1、すべきでありません2013年4月15日は2011年4月11日より* 4/14/2016に近づいているため、300となりますか? –

+0

はい、私はTable1の日付に最も近い前に存在したいです。 –

+0

私は想像しました - それは私の答えが解決すべきものです。私はそれが動作するのは不思議です:) –

答えて

0

興味深い質問。私はアペックスのことは知らないが、それは、OracleのMySQLのだったら、私はの道に沿って行くと思います:あなたの例では

SELECT 
    t2.id, 
    t2.date, 
    CASE WHEN t1.date IS NULL 
     THEN (SELECT table1.number FROM table1 WHERE table1.data <= t2.data ORDER BY table1.data DESC LIMIT 1) 
     ELSE t1.number 
    END AS numberT1, 
    t2.number as numberT2 
FROM table2 t2 
LEFT JOIN table1 t1 ON t1.date = t2.date 
+0

"apex"はデータベースではなく、devツール(これをクリアするだけ)であり、Oracleデータベース(mysqlではなく)上で動作します。あなたの構文は、ほとんどの場合、うまくいくでしょう。 'LIMIT'キーワードは使用できませんので、OPは結果を制限するために' ROWNUM'を使用するでしょう - > http://stackoverflow.com/questions/470542/how-do-i-limit-the- ORAによって返される行数(order-of-ordering) – Tom

関連する問題