1

各レコードの最新の日付のみを使用して oracle に新しいテーブルを作成し (ステップ 1)、その間の日数を計算する必要があります (ステップ 2)。

あなたの提案は大歓迎です:)))

ステップ 1: まず、テーブル USERS から各レコードの最大値 (Mod_date) を見つける必要があります。

表: ユーザー

名前................Mod_Date

ジェイソン・マーティン....... 1989 年 7 月 25 日

アル・マシューズ.........21-MAR-89

ジェームス・スミス……88年12月12日

ロバート・ブラック....... 15-JAN-84

ジェイソン・マーティン....... 1999 年 7 月 25 日

アル・マシューズ........... 21-MAR-96

ジェームス・スミス……1998年12月12日

ロバート・ブラック.......15-JAN-94

*TABLE_DESIRED_RESULTS_step1

名前....... Max(Mod_Date)

ジェイソン・マーティン....... 1999 年 7 月 25 日

アル・マシューズ........... 21-MAR-96

ジェームス・スミス........12-12-98

ロバート・ブラック.......15-JAN-94

ステップ 2: 「Regist_Date と Mod_Date の間の日数」を計算して表に追加します。

表: 登録

名前................登録日

ジェイソン・マーティン.........20-JUL-99

アル・マシューズ...........23-MAR-96

ロバート・ブラック.........1994 年 1 月 20 日

*TABLE_DESIRED_RESULTS_step2

Name.......Max(Mod_Date).....Regist_Date と Mod_Date の間の日数

ジェイソン・マーティン……1999年7月25日…………5

アル・マシューズ......... 21-MAR-96........-2

ジェームス・スミス.......12-DEC-98........null

ロバート・ブラック...... 15-JAN-94..........-5

*注意してください、このデータは構成されており、このロジックを追加する必要がある既存のユニオンと結合が既にあります。ありがとう、良い一日を!

4

1 に答える 1

0

これがサンプル付きの私の更新された回答です。

重要なことは、日付列に DATEタイプがあることです。以下は、指定したテーブルとデータです。

CREATE TABLE USERS
   (
    ID_USER NUMBER(6)  NOT NULL,
    NAME VARCHAR2(64)  NOT NULL,
    MOD_DATE DATE  NOT NULL,
    CONSTRAINT PK_user PRIMARY KEY (ID_USER)
   ) ;

    INSERT INTO USERS VALUES (1,'Jason Martin',TO_DATE('25-07-1989','DD-MM-YYYY'));
    INSERT INTO USERS VALUES (2,'Al Mathews',TO_DATE('21-03-1989','DD-MM-YYYY'));
    INSERT INTO USERS VALUES (3,'James Smith',TO_DATE('12-12-1988','DD-MM-YYYY'));
    INSERT INTO USERS VALUES (4,'Robert Black',TO_DATE('15-01-1984','DD-MM-YYYY'));
    INSERT INTO USERS VALUES (5,'Jason Martin',TO_DATE('25-07-1999','DD-MM-YYYY'));
    INSERT INTO USERS VALUES (6,'Al Mathews',TO_DATE('21-03-1996','DD-MM-YYYY'));
    INSERT INTO USERS VALUES (7,'James Smith',TO_DATE('12-12-1998','DD-MM-YYYY'));
    INSERT INTO USERS VALUES (8,'Robert Black',TO_DATE('15-01-1994','DD-MM-YYYY'));


CREATE TABLE REGISTRATION
   (
    ID_REG NUMBER(6)  NOT NULL,
    NAME VARCHAR2(64)  NOT NULL,
    REGIST_DATE DATE  NOT NULL,
    CONSTRAINT PK_reg PRIMARY KEY (ID_REG)
   ) ;

    INSERT INTO REGISTRATION VALUES (1,'Jason Martin',TO_DATE('20-07-1999','DD-MM-YYYY'));
    INSERT INTO REGISTRATION VALUES (2,'Al Mathews',TO_DATE('23-03-1996','DD-MM-YYYY'));
    INSERT INTO REGISTRATION VALUES (3,'Robert Black',TO_DATE('20-01-1994','DD-MM-YYYY'));

最初の一歩

   CREATE  TABLE TABLE_DESIRED_RESULTS_step1
   AS ( 
   SELECT
         u.NAME
        , max(u.MOD_DATE) as "maxi"
       FROM USERS u
       GROUP BY u.NAME);

第二段階

CREATE TABLE TABLE_DESIRED_RESULTS_step2 
AS (
SELECT 
    t.NAME 
    ,t."maxi"
    , (t."maxi" - r.REGIST_DATE ) as "Nbdays bw RegD and Mod_D"
FROM TABLE_DESIRED_RESULTS_step1 t LEFT OUTER JOIN REGISTRATION r 
ON t.NAME = r.NAME);

ここでのコツはLEFT OUTER JOIN、結合と一致しない場合は null 値を許可することです。


しかし、私にはデータベースの設計に関する懸念があります。まったく同じ名前のユーザーが 2 人いる場合、2 人を 1 人にマージします。ここでは、ID を使用して ID を結合するソリューションを示します。

CREATE TABLE USERS
   (
    ID_USER NUMBER(6)  NOT NULL,
    NAME VARCHAR2(64)  NOT NULL,
    CONSTRAINT PK_user PRIMARY KEY (ID_USER)
   ) ; 

CREATE TABLE MOD_USERS
   (
    ID_MOD NUMBER(6)  NOT NULL,
    ID_USER NUMBER(6)  NOT NULL,
    CONSTRAINT PK_usermod PRIMARY KEY (ID_MOD)
   ) ; 

ALTER TABLE MOD_USERS ADD (
     CONSTRAINT FK_user_mod
          FOREIGN KEY (ID_USER)
               REFERENCES USERS (ID_USER));

CREATE TABLE REGISTRATION
   (
    ID_REG NUMBER(6)  NOT NULL,
    ID_USER VARCHAR2(64)  NOT NULL,
    REGIST_DATE DATE  NOT NULL,
    CONSTRAINT PK_reg PRIMARY KEY (ID_REG)
   ) ;

ALTER TABLE REGISTRATION ADD (
     CONSTRAINT FK_user_reg
          FOREIGN KEY (ID_USER)
               REFERENCES USERS (ID_USER))

;

最初の一歩

   CREATE  TABLE TABLE_DESIRED_RESULTS_step1
   AS ( 
   SELECT
         m.ID_USER , u.NAME
        , max(u.MOD_DATE) as "maxi"
       FROM USERS u INNER JOIN MOD_USERS m
           ON u.ID_USER = m.ID_USER
       GROUP BY m.ID_USER , u.NAME);

第二段階

CREATE TABLE TABLE_DESIRED_RESULTS_step2 
AS (
SELECT 
    t.ID_USER , t.NAME 
    ,t."maxi"
    , (t."maxi" - r.REGIST_DATE ) as "Nbdays bw RegD and Mod_D"
FROM TABLE_DESIRED_RESULTS_step1 t LEFT OUTER JOIN REGISTRATION r 
ON t.ID_USER = r.ID_USER);
于 2011-04-20T21:37:16.977 に答える