
受付テーブルと顧客テーブルがあります。
受付テーブル(受付日、顧客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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
2016.3.2を日付として認識させたい
-
SQLで部分的にGROUP BYしたいとき
-
23時59分59秒までのデータを抽...
-
oracle 文字列 01:45 を時間に...
-
DB2のSQL(日付)について
-
sqlplusでヘッダーが付かない
-
Access VBAで行ラベルが定義さ...
-
Statement ignored というエラー
-
Accessのマクロでモジュールを...
-
Accessでのプロシージャの呼び...
-
日付型カラムへのデータINSERT
-
PL/SQLでSPOOLさせたいのですが...
-
ACCESS、時間ごとの集計の仕方は?
-
sp_executesqlを実行してもテー...
-
Oracle 10gで順序sequenceの作...
-
ROW_NUMBER()を使用したデータ取得
-
ストアド実行時のエラー「参照...
-
OutlookVBAで作成したマクロに...
-
ストアドプロシージャからアナ...
-
キャッシュを使わずにSELECTを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
重複するIDのデータを1行にま...
-
Accessの数値から時間に変換す...
-
SQLで部分的にGROUP BYしたいとき
-
wordの差し込み印刷での日付表示
-
SQLサーバで和暦から西暦に変換...
-
14桁の日付(YYYYMMDDHHMMSS)を...
-
日付型なら変数の先頭になん...
-
テーブルの主キーをdate型...
-
SQL ブレーク処理について
-
今日の日付が入った行のデータ...
-
23時59分59秒までのデータを抽...
-
DB2のSQL(日付)について
-
ExcelのSUMPRODUCTで日付の範囲...
-
日付書式に変換でこまっています!
-
4バイトの日付データを、16進数...
-
oracle 文字列 01:45 を時間に...
-
VARCHAR2とNUMBERで事足りる?
-
最新日付のデータを取得したい
-
日付の切り出し方法について
-
OSのシステム日付を変更して...
おすすめ情報