ビューを作成しているのですが、1つ分らないことがあり困っています。
SYSDATEに一番近い日付のレコードを抽出したいのですがどうすればいいのか分りませんどなたか知恵を貸していただけないでしょうか。よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

こんにちは。



先の内容から作成するとこんな感じでしょうか。
(確認している間が無かったので動作するかはわかりません。
B.ID || B.来店日 項目が文字型でなければTO_CAHRで文字列
変換してやる必要があるかもしれません。)


SELECT A.ID, A.CUSTNAME, A.SEX, A.PHONENO, B.来店日, B.担当, B.注文
FROM tab01 A, tab02 B
WHERE A.ID = B.ID
AND B.ID || B.来店日 IN
(SELECT ID || Max(来店日) FROM tab02
WHERE 来店日 <= TO_DATE(SYSDATE,'YYYY/MM/DD')
GROUP BY ID);
    • good
    • 0
この回答へのお礼

どうもありがとうございました。
望みどおりのビューを作成することができました。
感謝!感謝!です。

お礼日時:2001/12/12 20:53

Oralceはバージョンによって使用できるSQL文が


微妙に違います。

質問する際に、少なくとも
 Oracleのバージョン
 OS
程度は明らかにしてください。

この回答への補足

バージョンはオラクル8i 8.1.6です。
OSはwin2000です。

補足日時:2001/12/11 16:32
    • good
    • 0

とりあえず作ってみましたという感じです。


(実際使用するテーブル件数がやたら多い場合は
やめといたほうがいいかも知れません。)
当日を含む過去日付で一番直近なものをとってきます。
DBはORACLEでサンプルでついている EMP表で
作成してみました。
参考になるでしょうか?

SELECT EMPNO, ENAME,JOB, HIREDATE FROM EMP
WHERE HIREDATE =
(SELECT MAX(HIREDATE) FROM EMP
WHERE HIREDATE IN
(SELECT MAX(HIREDATE) FROM EMP
WHERE HIREDATE >= TO_DATE(SYSDATE,'YYYY/MM/DD')
GROUP BY HIREDATE));

この回答への補足

どうもありがとうございます。
SQLは結構複雑に組むことができるんですね。

もう少し突っ込んだ質問をしてよろしいでしょうか。

tab01
CUSTID CUSTNAME SEX  PHONENO  
01   鈴木    男   0311112222 
02   田村    男   0322223333

tab02
CUSTID   来店日   担当者  商品
01     2001/12/10  佐藤   ラーメン 
01     2001/12/15 斎藤   カレー
02     2001/12/08 原田   唐揚げ  
02     2001/12/14 峰    ハンバーグ 

これらの2つのテーブルから下のようなビューを作りたいと考えています。

VIEW
CUSTID CUSTNAME SEX PHONENO 来店日   担当者
01      鈴木    男   0311112222  2001/12/15     佐藤
02      田村    男   0322223333  2001/12/14    峰 


tab2のなかで同一のIDを持っているレコードの中から一番SYSDATEに近いレコードを
抽出したいのです。いろいろやっているのですが、どうしてもテーブルの中で一番SYSDATEに近いレコードを持ってきてしまいます。
ひき続き格闘しておりますので、お時間がありましたらアドバイスください。お願い致します。

補足日時:2001/12/11 18:31
    • good
    • 0

SELECT * FROM table


WHERE date-field <= SYSDATE
HAVING MAX(date-field)

って感じで出来ると思いますが…。
SYSDATEより新しい日付のデータが無いという前提ですが。
#未来の日付が入っているとは思えないので。

この回答への補足

ご解答ありがとうございます。
上の構文を試してみましたか、エラーになってしまいました。
せっかく教えていただいたのにこんなこといってすみません(汗)。
僕もいろいろ調べてみます。

補足日時:2001/12/11 10:32
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

関連するカテゴリからQ&Aを探す

このQ&Aと関連する良く見られている質問

Qアクセスで任意の件数を抽出するクエリでお知恵をお貸し下さい!

アクセス初心者です。
Win XP
Access2002
フォーム上にあるテキストボックスに任意の数値を入力しておき、入力した任意の数分のレコードを抽出してくるクエリを組みたいのですが、知恵が不足して出来ません。
SQLでselect top [Forms]![フォーム名]![テキストボックス名] など試してみたのですがダメでした。
どなたかお知恵をお貸し下さい。
できれば、SQL分でやるよりクエリの抽出条件の式でできればとも思っております。
宜しくお願いします。

Aベストアンサー

TOP値も試してみたということは何かの順番に取り出せばいいのですね

クエリで順位を求めるフィールドを作りそこの抽出条件に
パラメータで取り出し数を与えるようにすればいいいのでは

順位:DCount("*","テーブル名","フィールド名<" & [フィールド名]) + 1

抽出条件
<=Forms!フォーム名!条件テキストボックス名

Q指定された日付とマッチングした日付のレコードを取得するには?

おはようございます。
 質問なのですが、VBのフォームで、ラベルに現在時刻と日付を表示させています。表示された日付をもとに、データベースから同じ日のレコードを合計し、その合計した数値を取得したいと思います。この場合、どのようにSQLで記述すればよいのでしょうか?
 
 具体的には、客別の売上げ額を日付ごとに集計し、総合計を算出プログラムにしたいと思っています。
 そして、現在はDataEnvironmentを使用して作成しています。

Aベストアンサー

すむません。抜けがありました。
SELECT 顧客ID,購入日付,SUM(金額) AS 購入金額 FROM 売上
WHERE FORMAT(購入日付, "YYYYMMDD") BETWEEN FORMAT(開始日付, "YYYYMMDD") AND FORMAT(終了日付, "YYYYMMDD")
GRUOP BY 顧客ID,購入日付
でした。「GRUOP BY 顧客ID,購入日付」が抜けてました。

>FORMATはSQL内でも使用可能でしょうか?
DBがアクセスなら使えます。

>UriageSQL = "SELECT Sum(売上額) as 売上額 FROM 売上 WHERE 売上日=" & "#" & strDATE & "#"
でエラーとなるのは、売上日と条件設定が合ってないじゃないかと思いますが?
売上日は日付タイプの項目でしょうか?日付項目なら、SELECT SUM(金額) AS 購入金額 FROM 売上
WHERE FORMAT(購入日付, "YYYYMMDD") = FORMAT(現在日付, "YYYYMMDD")
で集計できるはずですが…。

すむません。抜けがありました。
SELECT 顧客ID,購入日付,SUM(金額) AS 購入金額 FROM 売上
WHERE FORMAT(購入日付, "YYYYMMDD") BETWEEN FORMAT(開始日付, "YYYYMMDD") AND FORMAT(終了日付, "YYYYMMDD")
GRUOP BY 顧客ID,購入日付
でした。「GRUOP BY 顧客ID,購入日付」が抜けてました。

>FORMATはSQL内でも使用可能でしょうか?
DBがアクセスなら使えます。

>UriageSQL = "SELECT Sum(売上額) as 売上額 FROM 売上 WHERE 売上日=" & "#" & strDATE & "#"
でエラーとなるのは、売上日と条件設...続きを読む

Qレコードの抽出

N1,N2,N3,N4,N5
1,3,17,20,25
2,11,12,21,30
1,8 10 24 30
11,12,14,20,31
8,9,15,21,25
2,11,16,24,29
2,11,12,13,28
8,19,21,23,30
17,18,19,20,30
上記のようなテーブルの中から、
”11以上20以下の数値が3つ以上含まれているレコード”を
抽出するためのSQL文を教えてください。

Aベストアンサー

Access での回答になります。

横での計算は苦手なので、ユーザ定義関数を作成します。

Public Function Check11_20_3(ParamArray iNum()) As Boolean
  Dim i As Integer
  Dim iCount As Integer

  iCount = 0
  For i = LBound(iNum) To UBound(iNum)
    If ((iNum(i) >= 11) And (iNum(i) <= 20)) Then
      iCount = iCount + 1
    End If
  Next
  If (iCount >= 3) Then
    Check11_20_3 = True
  Else
    Check11_20_3 = False
  End If
End Function

テーブル名を miniloto と仮定した場合、クエリでは

SELECT N1, N2, N3, N4, N5
FROM miniloto
WHERE Check11_20_3(N1,N2,N3,N4,N5);

とします。


ミニロトのデータだと思いますが、他のフィールドに回はありますか?
回フィールドがあったとして(提示では1~11)


SELECT 回, N1, N2, N3, N4, N5
FROM miniloto
WHERE 回 IN (
SELECT 回 FROM
(SELECT 回, N1 AS N FROM miniloto
UNION
SELECT 回, N2 AS N FROM miniloto
UNION
SELECT 回, N3 AS N FROM miniloto
UNION
SELECT 回, N4 AS N FROM miniloto
UNION
SELECT 回, N5 AS N FROM miniloto)
GROUP BY 回
HAVING SUM(IIF(N >= 11 AND N <= 20,1,0)) >=3
)
;

Access での回答になります。

横での計算は苦手なので、ユーザ定義関数を作成します。

Public Function Check11_20_3(ParamArray iNum()) As Boolean
  Dim i As Integer
  Dim iCount As Integer

  iCount = 0
  For i = LBound(iNum) To UBound(iNum)
    If ((iNum(i) >= 11) And (iNum(i) <= 20)) Then
      iCount = iCount + 1
    End If
  Next
  If (iCount >= 3) Then
    Check11_20_3 = True
  Else
    Check11_20_3 = False
  End If
...続きを読む

Q重複レコードの抽出について

以下のようなテーブルからmailが重複していてnameの値が全て同じ値を持つレコードを取得するためのSQL文を教えてください。

mail | name
-----------
aaa | 01
aaa | 01
aaa | 01
bbb | 02
bbb | 02
bbb | 01
ccc | 01
ccc | 01
ccc | 02

select * from test
where mail in
(select mail from test where mail group by mail having count(mail)>1)

上記のSQL文だと以下のデータが取得されてしまいます。

mail | name
-----------
aaa | 01 ○
aaa | 01 ○
aaa | 01 ○
bbb | 02 ×
bbb | 02 ×
ccc | 01 ×
ccc | 01 ×

○印のみ取得したいのですが、
SQL文をどのように修正すればよいのでしょうか。
よろしくお願いいたします。

以下のようなテーブルからmailが重複していてnameの値が全て同じ値を持つレコードを取得するためのSQL文を教えてください。

mail | name
-----------
aaa | 01
aaa | 01
aaa | 01
bbb | 02
bbb | 02
bbb | 01
ccc | 01
ccc | 01
ccc | 02

select * from test
where mail in
(select mail from test where mail group by mail having count(mail)>1)

上記のSQL文だと以下のデータが取得されてしまいます。

mail | name
-----------
aaa | 01 ○
aaa | 01 ○
aaa | 01 ○
...続きを読む

Aベストアンサー

RDBMS名とバージョンは?

重複データを何件も持つ意味があるのですか?

例えば、下記SQLでは、2列とも重複するデータを1回だけ表示します。同じデータを件数分表示する必要があるのですか?

【SQL例】
select mail,max(name) as name
from (select mail,name
from test
group by mail,name) as x
group by x.mail
having count(*)=1;

Qdistinct で抽出したレコード件数

MSaccessです。

氏名の重複可の住所録があります。

重複した氏名を1にカウントした全体のレコード数を求めるにはどうしたらよいでしょうか。

#SQLのみで取得したい。for・・など使わずに。

Aベストアンサー

大分前のことでうろ覚えですが
DISTINCTROW
をアクセスのヘルプで見てみてください。

SELECT DISTINCTROW 氏名
FROM テーブル


人気Q&Aランキング

おすすめ情報