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

受付テーブルと顧客テーブルがあります。
受付テーブル(受付日、顧客No、受付時間、受付内容)
顧客テーブル(顧客No、顧客名カナ、顧客名、顧客住所)

上記のテーブルがあるとします。
やりたい事は顧客Noを結合し
最新の受付日、前回受付日、前々回受付日を新しい受付日の順番に顧客毎に抽出したいのです。
仮に前回受付日と前々回受付日の内容が無ければNULL値を返します。


抽出したいフィールドは受付日、前回受付日、前々回受付日、顧客No、顧客名カナ、顧客名、顧客住所、受付内容です。
どんな構文になるのでしょうか?

どのようなSQLになるでしょうか?
うまく伝わっているでしょうか?

よろしくお願いします。

A 回答 (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受付データ>
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回に分けます
    • good
    • 0
この回答へのお礼

ありがとうございます。
やってみます。

お礼日時:2012/05/18 22:49

<#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


になります。
受付内容についてはそれぞれの日付においてデータがあるので、いろいろ考えてひとつにまとめればいいかと思います。

長くなりましたが、大体は実現可能です。
    • good
    • 0

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

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