2017-05-11 14 views
-2

アカウントには、毎年まで課金する必要があるアカウントがあるとします。日付付きSQLでの作業

したがって、発生した各料金について、日付を記載した表に行が生成されます。 残念ながら、何らかの理由により、特定の年に請求が拒否され、その年に行が生成されません。

私の目的は、料金が逃したアカウントとその年のすべてを見つけることです。

+1

テーブルの構造は何ですか?現在動作していないクエリは何ですか? –

+0

ACCTNO chargetype日 1 XYZ 20-01-2014 1 ABC 20-01-2015 1 XYZ 20-01-2017 2 20-01 XYZ XYZ 20-01-2015 2 XYZ 20-01-2016 2 -2017 –

+0

**あなたの質問に**いくつかのサンプルデータとそのデータに基づいて予想される出力を追加してください。 [**フォーマットされたテキスト**](http://stackoverflow.com/help/formatting)、[スクリーンショットなし](http://meta.stackoverflow.com/questions/285551/why-may-i-not -upload-images-of-code-on-so-asking-a-question/285557#285557)。不十分な質問に対する詳細な回答については、コードまたはその他の情報をコメント –

答えて

0

下記の解決策では、未払いの年が見つかるでしょうが、あなたのテーブルにお支払いを示す年の間だけです。 ではなく、最初の年に支払が見落とされたか、受け取られなかった支払いが見つからなかったことがわかります。 (たとえば、支払額が2010年から2016年で、表に2012年、2013年、2015のみが表示されていれば、ソリューションは2014年を見つけることになりますが、2010年、2011年および2016年は見つかりません)。あなたのテーブルのデータは、それらの不足した支払いを見つけるのに十分ではありません。また、アカウントにお支払いがあっても、となった場合、そのアカウントはあなたのテーブルにはまったく存在しないため、解決策にはそれらのアカウントをキャッチできません。

with 
    test_data (acctno, chargetype, dt) as (
     select 1, 'xyz', to_date('20-01-2014', 'dd-mm-yyyy') from dual union all 
     select 1, 'abc', to_date('20-01-2015', 'dd-mm-yyyy') from dual union all 
     select 1, 'xyz', to_date('20-01-2017', 'dd-mm-yyyy') from dual union all 
     select 2, 'xyz', to_date('20-01-2015', 'dd-mm-yyyy') from dual union all 
     select 2, 'xyz', to_date('20-01-2016', 'dd-mm-yyyy') from dual union all 
     select 2, 'xyz', to_date('20-01-2017', 'dd-mm-yyyy') from dual 
    ) 
-- End of test data (not part of the solution) 
-- Query begins below this line; use your actual table name instead of "test_data" 
select acctno, min_year + level - 1 as yr 
from (
     select acctno, 
        min(extract(year from dt)) min_year, 
        max(extract(year from dt)) max_year 
     from  test_data 
     group by acctno 
     ) 
where (acctno, min_year + level - 1) not in (select acctno, extract(year from dt) 
               from test_data 
              ) 
connect by level <= max_year - min_year + 1 
     and prior acctno = acctno 
     and prior sys_guid() is not null 
; 

ACCTNO YR 
------ ---- 
    1 2016 
+0

に投稿しないでください。 – unleashed