2016-07-27 12 views
0

こんにちは、こんにちは。 私はそのようなテーブルを持っています。私は基本的に私のアカウントはこれがのサブセットだけである2で始まるの間でからおよびに値を与えるクエリを選択しようとしているこれらの値2つの列で2つの値を選択してください

INSERT INTO ACCT VALUES ('2015', '2018'); 
INSERT INTO ACCT VALUES ('2019'); 
INSERT INTO ACCT (ACCT_FROM) VALUES ('2019'); 

"ACCT_FROM" "ACCT_TO" 
"2015" "2018" 
"2019" "" 

CREATE TABLE ACCT (ACCT_FROM VARCHAR2(6) , ACCT_TO VARCHAR2(6)); 

はるかに大きなテーブル。だから私は何かのようになりたいです

ACCT 
2015 
2016 
2017 
2018 
2019 

私は以下のようなものを試しましたが、私はどこにもいません。

select acct_from from ACCT where 
acct_from between '2000' and '2999' 
and (ACCT_FROM like '2%' or ACCT_TO like '2%') ; 

誰かが適切な結果を得るのを助けることができますか?

ありがとうございました。

+0

あなたの値はすべて4桁の数字です。1996年のようなものもあれば、2から始まるものもありますか?そして、2で始まる最も小さいものを見つけたいと思います。最大のものは2で始まり、1つの列にすべてのギャップを埋めるのですか?数字は考慮する必要があります - 一緒に考慮する入力テーブルの両方の列のすべての数字? – mathguy

答えて

1

あなたはと思われます。はこのようにしてください。それは奇妙な要件です。たぶんあなたはイラストレーションのためだけに「年」を使いましたが、実際に年であれば、行にACCT_FROM = 1997、ACCT_TO = 2003の場合はどうなりますか?結果セットに2000年、2001年、2002年、2003年を含めるべきではないか?

とにかく - 以下の解決策は、あなたが要求したものに答えています。あなたが要求することを意図したものではありません。これが必要なものでない場合は、明確にしてください。

with 
    acct (acct_from, acct_to) as (
     select '2015', '2018' from dual union all 
     select '2019', null from dual 
    ), 
    prep (acct_2xxx) as (
     select to_number(acct_from) 
     from acct 
     where acct_from like '2%' 
     union all 
     select to_number(acct_to) 
     from acct 
     where acct_to like '2%' 
    ), 
    acct_m (acct_min, acct_max) as (
     select min(acct_2xxx), max(acct_2xxx) 
     from prep 
    ) 
select to_char(acct_min + level - 1) as acct_all 
from acct_m 
connect by level <= acct_max - acct_min + 1 
; 

ACCT_ALL 
---------------- 
2015 
2016 
2017 
2018 
2019 

5 rows selected. 

NOTE - 私はまた、あなたが真剣にテーブルのために、別のテーブルの列に同じ名前(ACCT)を使用することを意味しなかったと仮定。私はあなたの指導に従っていませんでした。

+0

実際には4桁のアカウントコードです。応答をありがとう私は私が扱っていたものを正確に表示する方法として私のdllと私のインサートを与えた。これは私がコントロールできるテーブルではありません。私の会社が買ったソフトウェアの一部なので、番号に変換されます。私は感謝の応答をありがとう。 – Miguel

+0

@Miguel - 理解しましたが、結果セット内の列の名前を制御できますか?そうでないと、ACCTと呼ぶことはできません。もっと重要なのは、それはあなたが必要としていたものなのでしょうか? 2003年から2008年、2033年から2036年までの2つの行を考えています。2003年から2008年、2033年から2036年までのすべての数値、または2003年から2036年までのすべての数値が必要ですか?私のソリューションは後者を(すべての数字) - それはあなたが必要なものですか? – mathguy

0

私はあなたがこの探している考える

SELECT Val 
FROM 
(
    SELECT ACCT_FROM AS Val FROM ACCT WHERE ACCT_FROM like '2%' 
    UNION 
    SELECT ACCT_TO AS Val FROM ACCT WHERE ACCT_TO like '2%' 
) T 
ORDER BY Val 

変更UNIONUNION ALLにあなたが

+0

それは2016を逃す。 – Miguel

+0

ああ、私は今それを得る...欠けている値を作成したい。実行可能な数値だが、あなたの列はvarcharと宣言されています。だからそこにはどんな価値がありますか?今すぐ寝る。明日、私は誰も答えなかったらこれを見ます –

0

OK重複を維持したい場合、私は答えを持っています。うまくいけば、これは他の誰かを助けるでしょう

with rangeOfAccounts(accounts, acct_to) as (
    select to_number(acct_from) as accounts, to_number(ACCT_TO) as acct_to 
    from acct where acct_from like '2%' 
    union all 
    select accounts + 1, ACCT_TO 
    from rangeOfAccounts 
    where accounts + 1 <= ACCT_TO 
) 
select accounts 
from rangeOfAccounts 
order by accounts 
2

私はあなたにとって素晴らしいものがあります。私はいくつかの仮定をしました。あなたのvarchar coloumnのデータは数値です。または、正確に年番号になる。 2999

2000から組合の最初の部分を数字を生成している

with nrs as (select rownum +1999 nr from (select 1 from dual group by cube (1,2,3,4,5,6,7,8,9,10)) where rownum <= 1000) 

が起こっていただきましたので、これは「NRジェネレータ」からacct_toとacct_fromだけの数の間のすべての数値を表示するために使用しています。

共用体の2番目の部分は、acct_fromがnullの2000年から2999までのすべてのnrsを追加します。

ユニオンはすべての重複を失います。

with nrs as (select rownum +1999 nr from (select 1 from dual group by cube (1,2,3,4,5,6,7,8,9,10)) where rownum <= 1000) 
select nrs.nr 
from acct 
,  nrs 
where acct_to is not null 
and nrs.nr between to_number(acct_from) and to_number(acct_to) 
union 
select to_number(acct_from) 
from acct 
where acct_to is null 
and to_number(acct_from) between 2000 and 2999 

;

関連する問題