dポイントプレゼントキャンペーン実施中!

初めて質問します。

下記のようなデータが存在します。
テーブルA
NO DATE GYO
1 2010/12/01 1
1 2010/12/01 2
2 2010/12/01 1
2 2010/12/01 2
2 2010/12/01 3
3 2010/12/02 1 <=
4 2010/12/03 1
4 2010/12/03 2

上記データにて、<=の行の値を取得し変数へ代入したとします。
変数.NO =3
変数.日付 =2010/12/02
変数.GYO =1

上記、変数を元に1件前のレコードを抽出したいのですが
SQL文でのいい方法がわかりません。

取得したいレコード
1 2010/12/01 1
1 2010/12/01 2
2 2010/12/01 1
2 2010/12/01 2
2 2010/12/01 3

どうかお願いいたします。

A 回答 (3件)

こんばんは。



単純に文字列結合して、小さいものを取ればいいのでは?
DATEカラムがDATE型、GYOカラムがNUMBER型と仮定します。
違ってたら、適当に型変換してください・・・。

SELECT *
FROM テーブルA
WHERE TO_CHAR(DATE,'YYYYMMDD')||RPAD(TO_CHAR(GYO),3,'0') < 同じように変換した、対象データ

やってる事は一緒です。
ただ、SQLでやってるだけ・・・。
    • good
    • 0
この回答へのお礼

遅くなり申し訳ございません。

ご回答ありがとうございました。
SQL文でカラム同士を結合できるのですね。
すみません。勉強不足でした。

大変、参考になりました。ありがとうございました。
また、今後ともよろしくお願いいたします。

お礼日時:2011/01/04 06:44

推測ですが


SELECT *
FROM テーブルA
WHERE (NO,DATE,GYO) < ( 3,TO_DATE('2010/12/02','YYYY/MM/DD'), 1)

みたいな事をやりたいということでしたら、Oracleでは文法エラーになってしまいます。
(PostgreSQLだと出来るのですが)

なんで
(NO<3) or
( (NO=3) and (DATE<TO_DATE('2010/12/02','YYYY/MM/DD') ) or
( (NO=3) and (DATE=TO_DATE('2010/12/02','YYYY/MM/DD') and ( GYO<1 ))
と書くしかないですね。

外していたらごめんなさい。

この回答への補足

ご回答ありがとうございました。
ただ私の質問の仕方がまずくNoは実データとしては存在せずに
データの並びとしてわかりやすいように記載していました。
実データとしてはDATE、GYOのみです。
申し訳ございません。

具体的な実データの中身は
テーブルA
DATE(10桁) GYO(3桁)
2010/12/01 1
2010/12/01 2
2010/12/01 3
2010/12/02 1 <=
2010/12/03 1
2010/12/03 2

現在は、
select
*
from
テーブルA
where
(SAGYODAY <= '2010/12/02')
order by
DATE DEC
,GYO DEC

にて
一旦、範囲を日付だけでデータ取得し、プログラム内部で
DATEとGYOを結合し(GYOは3桁0埋め変換)
2010/12/02001 <=
2010/12/01003
2010/12/01002
2010/12/01001

<=のデータより小さいデータを対象として処理を行っています。

この処理を行うのではなく、SQLだけでデータ取得できないかと思っております。

申し訳ございませんが、よろしくお願い致します。

補足日時:2010/12/29 11:14
    • good
    • 0

このテーブルのデータだけを考えると


Where no < 変数.NO
だけでないでしょうか?

この回答への補足

ご回答ありがとうございました。
ただ私の質問の仕方がまずくNoは実データとしては存在せずに
データの並びとしてわかりやすいように記載していました。
実データとしてはDATE、GYOのみです。
申し訳ございません。

具体的な実データの中身は
テーブルA
DATE(10桁) GYO(3桁)
2010/12/01 1
2010/12/01 2
2010/12/01 3
2010/12/02 1 <=
2010/12/03 1
2010/12/03 2

現在は、
select
*
from
テーブルA
where
(SAGYODAY <= '2010/12/02')
order by
DATE DEC
,GYO DEC

にて
一旦、範囲を日付だけでデータ取得し、プログラム内部で
DATEとGYOを結合し(GYOは3桁0埋め変換)
2010/12/02001 <=
2010/12/01003
2010/12/01002
2010/12/01001

<=のデータより小さいデータを対象として処理を行っています。

この処理を行うのではなく、SQLだけでデータ取得できないかと思っております。

申し訳ございませんが、よろしくお願い致します。

補足日時:2010/12/29 11:15
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!