![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
受付テーブルと顧客テーブルがあります。
受付テーブル(受付日、顧客No、受付時間、受付内容)
顧客テーブル(顧客No、顧客名カナ、顧客名、顧客住所)
上記のテーブルがあるとします。
やりたい事は顧客Noを結合し
最新の受付日、前回受付日、前々回受付日を新しい受付日の順番に顧客毎に抽出したいのです。
仮に前回受付日と前々回受付日の内容が無ければNULL値を返します。
抽出したいフィールドは受付日、前回受付日、前々回受付日、顧客No、顧客名カナ、顧客名、顧客住所、受付内容です。
どんな構文になるのでしょうか?
どのようなSQLになるでしょうか?
うまく伝わっているでしょうか?
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
ちょっと大変ですが。
。。<TABLE顧客>
CREATE TABLE RMS01.AA_KOKYAKU
(
KOKYAKU_ID NUMBER(10,0) NOT NULL,
KOKYAKU_NAME_KANA VARCHAR2(20 CHAR) ,
KOKYAKU_NAME VARCHAR2(50 CHAR) ,
KOKYAKU_ADD VARCHAR2(100 CHAR) ,
CONSTRAINT PK_AA_KOKYAKU PRIMARY KEY (KOKYAKU_ID) USING INDEX;
<TABLE顧客データ>
1000000アオキAOKI神奈川県横浜市都筑区1-1-1
1000001オリヒカORIHICA神奈川県横浜市都筑区1-1-2
<TABLE受付>
CREATE TABLE RMS01.AA_UKETUKE
(
KOKYAKU_ID NUMBER(10,0) NOT NULL,
UKETUKE_DATE DATE NOT NULL,
UKETUKE_TIME VARCHAR2(8 CHAR) NOT NULL,
UKETUKE_NAIYO VARCHAR2(100 CHAR) ,
CONSTRAINT AA_UKETUKE PRIMARY KEY (KOKYAKU_ID, UKETUKE_DATE, UKETUKE_TIME) USING INDEX;
<TABLE受付データ>
10000002012/05/15 09:00:00 訪問1
10000002012/05/14 09:00:00 訪問2
10000012012/05/13 08:00:00 訪問3
10000002012/05/10 09:00:00 訪問4
10000012012/05/10 09:00:00 訪問5
10000002012/05/01 09:00:00 訪問6
10000012012/05/01 09:00:00 訪問7
10000012012/04/30 09:00:00 訪問8
の場合で。。
<VIEW顧客>の作成(顧客ごとで日付のデータ)
CREATE OR REPLACE VIEW AA_KOKYAKU_V
(UKETUKE_DATE,UKETUKE_TIME,KOKYAKU_ID,KOKYAKU_NAME_KANA,KOKYAKU_NAME,
KOKYAKU_ADD,UKETUKE_NAIYO)
AS
SELECT
AAU.UKETUKE_DATE,
AAU.UKETUKE_TIME,
AAK.KOKYAKU_ID,
AAK.KOKYAKU_NAME_KANA,
AAK.KOKYAKU_NAME,
AAK.KOKYAKU_ADD,
AAU.UKETUKE_NAIYO
FROM AA_KOKYAKU AAK /* 顧客マスタ */
,AA_UKETUKE AAU /* 受付 */
where AAK.KOKYAKU_ID = AAU.KOKYAKU_ID
order by AAK.KOKYAKU_ID,AAU.UKETUKE_DATE desc,AAU.UKETUKE_TIME desc
/
<VIEW顧客>のデータ
2012/05/1509:00:001000000アオキAOKI神奈川県横浜市都筑区1-1-1訪問1
2012/05/1409:00:001000000アオキAOKI神奈川県横浜市都筑区1-1-1訪問2
2012/05/1009:00:001000000アオキAOKI神奈川県横浜市都筑区1-1-1訪問4
2012/05/0109:00:001000000アオキAOKI神奈川県横浜市都筑区1-1-1訪問6
2012/05/1308:00:001000001オリヒカORIHICA神奈川県横浜市都筑区1-1-2訪問3
2012/05/1009:00:001000001オリヒカORIHICA神奈川県横浜市都筑区1-1-2訪問5
2012/05/0109:00:001000001オリヒカORIHICA神奈川県横浜市都筑区1-1-2訪問7
2012/04/3009:00:001000001オリヒカORIHICA神奈川県横浜市都筑区1-1-2訪問8
<VIEW日付1>(最新以外のデータ)
CREATE OR REPLACE VIEW AA_DATE_V01
(UKETUKE_DATE,KOKYAKU_ID)
AS
select UKETUKE_DATE,
KOKYAKU_ID
from AA_KOKYAKU_V
minus
(select max(UKETUKE_DATE),
KOKYAKU_ID
from AA_KOKYAKU_V
group by KOKYAKU_ID)
order by KOKYAKU_ID, UKETUKE_DATE desc
/
<VIEW日付1>(最新以外のデータ)
2012/05/141000000
2012/05/101000000
2012/05/011000000
2012/05/101000001
2012/05/011000001
2012/04/301000001
<VIEW日付2>(前回受付日以外のデータ)
CREATE OR REPLACE VIEW AA_DATE_V02
(UKETUKE_DATE,KOKYAKU_ID)
AS
select UKETUKE_DATE,
KOKYAKU_ID
from AA_DATE_V01
minus
(select max(UKETUKE_DATE),
KOKYAKU_ID
from AA_DATE_V01
group by KOKYAKU_ID)
order by KOKYAKU_ID, UKETUKE_DATE desc
/
<VIEW日付2>(前回受付日以外のデータ)
2012/05/101000000
2012/05/011000000
2012/05/011000001
2012/04/301000001
<最新の日付、前回の受付日、前々回の受付日の取得ルーチン>
CREATE OR REPLACE FUNCTION AA_GET_DATE
(I_ID IN NUMBER,
I_NO IN NUMBER)
RETURN DATE IS
--
-- I_NO = 1 (最新の受付日)
-- I_NO = 2 (前回受付日)
-- I_NO = 3 (前々回受付日)
L_date DATE;
L_id NUMBER;
BEGIN
--
if I_NO = 1 then
select max(UKETUKE_DATE),
KOKYAKU_ID
into L_date,
L_id
from AA_KOKYAKU_V
where KOKYAKU_ID = I_id
group by KOKYAKU_ID;
elsif I_NO = 2 then
select max(UKETUKE_DATE),
KOKYAKU_ID
into L_date,
L_id
from AA_DATE_V01
where KOKYAKU_ID = I_id
group by KOKYAKU_ID;
elsif I_NO = 3 then
select max(UKETUKE_DATE),
KOKYAKU_ID
into L_date,
L_id
from AA_DATE_V02
where KOKYAKU_ID = I_id
group by KOKYAKU_ID;
end if;
RETURN L_date;
EXCEPTION
when OTHERS then
return NULL;
END AA_GET_DATE;
/
回答は2回に分けます
No.2
- 回答日時:
<#1の2回目>
<VIEW(KOKYAKU_V01)の作成>
日付の取得でそれそれを抽出
CREATE OR REPLACE VIEW AA_KOKYAKU_V01
(UKETUKE_DATE01,UKETUKE_DATE02,UKETUKE_DATE03,KOKYAKU_ID,KOKYAKU_NAME_KANA,
KOKYAKU_NAME,KOKYAKU_ADD)
AS
SELECT
AA_GET_DATE(KOKYAKU_ID,1) UKETUKE_DATE01,
AA_GET_DATE(KOKYAKU_ID,2) UKETUKE_DATE02,
AA_GET_DATE(KOKYAKU_ID,3) UKETUKE_DATE03,
KOKYAKU_ID,
KOKYAKU_NAME_KANA,
KOKYAKU_NAME,
KOKYAKU_ADD
FROM AA_KOKYAKU_V
order by KOKYAKU_ID,UKETUKE_DATE,UKETUKE_TIME
/
<データ>
2012/05/152012/05/142012/05/101000000アオキAOKI神奈川県横浜市都筑区1-1-1
2012/05/152012/05/142012/05/101000000アオキAOKI神奈川県横浜市都筑区1-1-1
2012/05/152012/05/142012/05/101000000アオキAOKI神奈川県横浜市都筑区1-1-1
2012/05/152012/05/142012/05/101000000アオキAOKI神奈川県横浜市都筑区1-1-1
2012/05/132012/05/102012/05/011000001オリヒカORIHICA神奈川県横浜市都筑区1-1-2
2012/05/132012/05/102012/05/011000001オリヒカORIHICA神奈川県横浜市都筑区1-1-2
2012/05/132012/05/102012/05/011000001オリヒカORIHICA神奈川県横浜市都筑区1-1-2
2012/05/132012/05/102012/05/011000001オリヒカORIHICA神奈川県横浜市都筑区1-1-2
<VIEW(KOKYAKU_V02)の作成>
<VIEW(KOKYAKU_V01)>をDISTINCTする。
CREATE OR REPLACE VIEW AA_KOKYAKU_V02
(KOKYAKU_ID,UKETUKE_DATE01,UKETUKE_DATE02,UKETUKE_DATE03,KOKYAKU_NAME_KANA,
KOKYAKU_NAME,KOKYAKU_ADD)
AS
SELECT
distinct(KOKYAKU_ID),
UKETUKE_DATE01,
UKETUKE_DATE02,
UKETUKE_DATE03,
KOKYAKU_NAME_KANA,
KOKYAKU_NAME,
KOKYAKU_ADD
FROM AA_KOKYAKU_V01
order by KOKYAKU_ID
/
<データ>
10000002012/05/152012/05/142012/05/10アオキAOKI神奈川県横浜市都筑区1-1-1
10000012012/05/132012/05/102012/05/01オリヒカORIHICA神奈川県横浜市都筑区1-1-2
<VIEW(KOKYAKU_V02)>の情報から。
SELECT
UKETUKE_DATE01,
UKETUKE_DATE02,
UKETUKE_DATE03,
KOKYAKU_ID,
KOKYAKU_NAME_KANA,
KOKYAKU_NAME,
KOKYAKU_ADD
FROM AA_KOKYAKU_V02
order by KOKYAKU_ID:
2012/05/152012/05/142012/05/101000000アオキAOKI神奈川県横浜市都筑区1-1-1
2012/05/132012/05/102012/05/011000001オリヒカORIHICA神奈川県横浜市都筑区1-1-2
になります。
受付内容についてはそれぞれの日付においてデータがあるので、いろいろ考えてひとつにまとめればいいかと思います。
長くなりましたが、大体は実現可能です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- その他(データベース) accessについて 2 2022/05/31 16:58
- Visual Basic(VBA) 指定月分の顧客データファイルを統合して並べ替え、所定の場所に貼り付ける 3 2022/09/10 07:55
- Visual Basic(VBA) 指定月分の顧客データファイルを統合して並べ替え、所定の場所に貼り付ける (再質問) 4 2022/09/14 22:51
- Access(アクセス) Access IF文でテーブルに存在しない場合の処理について 2 2022/10/10 18:09
- その他(開発・運用・管理) マイクロソフト製品のライセンス販売で困ってます 1 2022/06/30 19:52
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/04 17:58
- Visual Basic(VBA) 複数ページあるPDFファイル内の文字列等の情報をキーにPDFをグループ分け分割したい。 2 2022/06/25 09:51
- Access(アクセス) 対象月の2桁表示について 1 2023/01/07 05:08
- 金銭トラブル・債権回収 クレーマーと社長の間に挟まれて困っています 6 2023/01/27 11:32
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQL/Loaderでの年月日時分秒の...
-
ドメインの取得日を変更する方法
-
Accessの数値から時間に変換す...
-
SQL文を教えてください。
-
oracle 文字列 01:45 を時間に...
-
Transact-SQLでストアードプロ...
-
ODBCリンクの際にACCESSでは読...
-
TeXの索引作成に関して
-
Accessのマクロでモジュールを...
-
SSIS 変数の値をSQL実行タスク...
-
callで順に実行されるプロシー...
-
wordで文字の上に線を引きたい...
-
医は仁術ですか算術ですか
-
オラクルのデフォルトセッション数
-
ストアドプロシジャからストア...
-
エクセルVBAの次のコードの...
-
Access VBAで行ラベルが定義さ...
-
PL/SQLのエラーについて
-
エクセルVBAでUserFormを起動し...
-
ブラウザ上に表示されたデータ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
今日の日付が入った行のデータ...
-
エクセルの日付に時差を加算 #V...
-
Accessの数値から時間に変換す...
-
エクセル 日付による並べ替え...
-
SQLサーバで和暦から西暦に変換...
-
SQLで部分的にGROUP BYしたいとき
-
重複するIDのデータを1行にま...
-
テーブルの主キーをdate型...
-
yyyy/M/dをyyyy/MM/ddに変換
-
ExcelのSUMPRODUCTで日付の範囲...
-
WHERE句にて「30日前から今日ま...
-
14桁の日付(YYYYMMDDHHMMSS)を...
-
日付書式に変換でこまっています!
-
エクセルVBA 今日の日付行...
-
特定の日付が第何週目にあるか...
-
SQLite3のtext→date変換について
-
日付型なら変数の先頭になん...
-
oracle 文字列 01:45 を時間に...
-
Oracle10gのsql分についての質...
-
Excelグラフの日付軸の日付がず...
おすすめ情報