- ベストアンサー
SQL文で顧客情報と最新の受付日を取得する方法
- 受付テーブルと顧客テーブルを結合し、最新の受付日と顧客情報を抽出するためのSQL文を教えてください。
- 要求されたフィールドを含むレコードを取得するためのSQL文を教えてください。
- 顧客情報と最新の受付日を抽出するためのSQL文を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ちょっと大変ですが。。。 <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受付データ> 1000000 2012/05/15 09:00:00 訪問1 1000000 2012/05/14 09:00:00 訪問2 1000001 2012/05/13 08:00:00 訪問3 1000000 2012/05/10 09:00:00 訪問4 1000001 2012/05/10 09:00:00 訪問5 1000000 2012/05/01 09:00:00 訪問6 1000001 2012/05/01 09:00:00 訪問7 1000001 2012/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/15 09:00:00 1000000 アオキ AOKI 神奈川県横浜市都筑区1-1-1 訪問1 2012/05/14 09:00:00 1000000 アオキ AOKI 神奈川県横浜市都筑区1-1-1 訪問2 2012/05/10 09:00:00 1000000 アオキ AOKI 神奈川県横浜市都筑区1-1-1 訪問4 2012/05/01 09:00:00 1000000 アオキ AOKI 神奈川県横浜市都筑区1-1-1 訪問6 2012/05/13 08:00:00 1000001 オリヒカ ORIHICA 神奈川県横浜市都筑区1-1-2 訪問3 2012/05/10 09:00:00 1000001 オリヒカ ORIHICA 神奈川県横浜市都筑区1-1-2 訪問5 2012/05/01 09:00:00 1000001 オリヒカ ORIHICA 神奈川県横浜市都筑区1-1-2 訪問7 2012/04/30 09:00:00 1000001 オリヒカ 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/14 1000000 2012/05/10 1000000 2012/05/01 1000000 2012/05/10 1000001 2012/05/01 1000001 2012/04/30 1000001 <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/10 1000000 2012/05/01 1000000 2012/05/01 1000001 2012/04/30 1000001 <最新の日付、前回の受付日、前々回の受付日の取得ルーチン> 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回に分けます
その他の回答 (1)
- patak_m23d
- ベストアンサー率40% (23/57)
<#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/15 2012/05/14 2012/05/10 1000000 アオキ AOKI 神奈川県横浜市都筑区1-1-1 2012/05/15 2012/05/14 2012/05/10 1000000 アオキ AOKI 神奈川県横浜市都筑区1-1-1 2012/05/15 2012/05/14 2012/05/10 1000000 アオキ AOKI 神奈川県横浜市都筑区1-1-1 2012/05/15 2012/05/14 2012/05/10 1000000 アオキ AOKI 神奈川県横浜市都筑区1-1-1 2012/05/13 2012/05/10 2012/05/01 1000001 オリヒカ ORIHICA 神奈川県横浜市都筑区1-1-2 2012/05/13 2012/05/10 2012/05/01 1000001 オリヒカ ORIHICA 神奈川県横浜市都筑区1-1-2 2012/05/13 2012/05/10 2012/05/01 1000001 オリヒカ ORIHICA 神奈川県横浜市都筑区1-1-2 2012/05/13 2012/05/10 2012/05/01 1000001 オリヒカ 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 / <データ> 1000000 2012/05/15 2012/05/14 2012/05/10 アオキ AOKI 神奈川県横浜市都筑区1-1-1 1000001 2012/05/13 2012/05/10 2012/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/15 2012/05/14 2012/05/10 1000000 アオキ AOKI 神奈川県横浜市都筑区1-1-1 2012/05/13 2012/05/10 2012/05/01 1000001 オリヒカ ORIHICA 神奈川県横浜市都筑区1-1-2 になります。 受付内容についてはそれぞれの日付においてデータがあるので、いろいろ考えてひとつにまとめればいいかと思います。 長くなりましたが、大体は実現可能です。
お礼
ありがとうございます。 やってみます。