Как получить пользователей с назначенным для них значением assignment_status = 'Open' ИЛИ ​​assignment_status = 'Limited' со значением 'assignment_limited_threshold'? - PullRequest
0 голосов
/ 11 ноября 2019

Приложение - Система присвоения кредитов. У меня есть список пользователей. Основываясь на навыках и статусе назначения, мне нужно получить список подходящих пользователей. Существует три таблицы, относящиеся к пользователю - 'user_info' , 'user_skill' & 'assignment_details' . Одна таблица, относящаяся к ссуде, в которой указано, какому пользователю был назначен ссуда, т. Е. Таблица loan_mapping Чтобы получить список подходящих, у меня есть два основных условия.

  1. Значение skill_id из таблицы user_skill должно быть 156.
  2. Для каждого пользователя для assignment_status должно быть указано «Open» OR assignment_status = 'Limited' вместе сЗНАЧЕНИЕ 'assignment_limited_threshold' должно быть БОЛЬШЕ, чем общее количество ссуд, назначенных этому пользователю . (Другими словами, общее количество назначений ссуд для каждого пользователя не должно превышать это значение assignment_limited_threshold)

user_id - это условие соединения для таблиц, связанных с пользователями.

Ниже приведены определения таблиц:

      CREATE TABLE public.user_info(
        user_id integer NOT NULL DEFAULT 
         nextval('lsa_user_info_user_id_seq'::regclass),
         email_id character varying(255),
       user_name character varying(255),
       lob_id  integer NOT NULL,
        status_id integer,
       CONSTRAINT user_info_pkey PRIMARY KEY (user_id)
      ) 
    WITH (
     OIDS=FALSE
    );
  ALTER TABLE public.lsa_user_info
    OWNER TO postgres;



    CREATE TABLE public.user_skill
       (
         user_id integer NOT NULL,
         skill_id integer NOT NULL,
         CONSTRAINT user_skill_pkey PRIMARY KEY (user_id, skill_id),
       CONSTRAINT fk_user_skill_skill_id FOREIGN KEY (skill_id)
       REFERENCES public.skill (skill_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
     CONSTRAINT fk_user_skill_user_id FOREIGN KEY (user_id)
   REFERENCES public.user_info (user_id) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION )
   WITH (
       OIDS=FALSE
    );
    ALTER TABLE public.user_skill
        OWNER TO postgres;



         CREATE TABLE public.assignment_details
         (
           user_id integer NOT NULL,
          role_id integer NOT NULL,
         lob_id  integer NOT NULL,
         assignment_status character varying,
         assignment_limited_threshold integer,
          CONSTRAINT lsa_assignment_details_pkey PRIMARY KEY (user_id, 
        role_id, lob_id  )
       )
     WITH (
        OIDS=FALSE
   );
         ALTER TABLE public.assignment_details
     OWNER TO postgres;



          CREATE TABLE public.loan_mapping 
          (
        loan_number           bigint NOT NULL,
         spoc_id               integer NOT NULL,

       loan_spoc_map_id      integer NOT NULL DEFAULT nextval 
        ('lsa_loan_spoc_mapping_loan_spoc_map_id_seq'::regclass),
          lob_id   integer,

      CONSTRAINT loan_spoc_mapping_pk PRIMARY KEY (loan_spoc_map_id),
   CONSTRAINT fk_loan_spoc_loan_number FOREIGN KEY (loan_number)
      REFERENCES public.loan_details (loan_number) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION,
    CONSTRAINT fk_loan_spoc_spoc_id FOREIGN KEY (spoc_id)
     REFERENCES public.user_info (user_id) MATCH SIMPLE
     ON UPDATE NO ACTION ON DELETE NO ACTION
  )
      WITH (
      OIDS=FALSE
  );
   ALTER TABLE public.loan_mapping 
  OWNER TO postgres;

Табличные записи, например, как показано ниже,

  -----user_info ----
    user_id   |  user_name   | lob_id  |  email_id         |    status_id

     111            abc            5      abc@gmail.com           2
    222             def            5      def@gmail.com           6
     333            ghi            5      ghi@gmail.com           2
     444            jkl            5      jkl@hotmail.com         2

----------- user_skill ----------------

        user_id  |  skill_id

          111          156
          222          156
          333          156
          444          156

----- assignment_details ----------------

user_id |role_id |lob_id |assignment_status |assignment_limited_threshold

111         11       5          Open
222         11       5          No              
333         11       5        Limited               2
444         11       5        Limited               10


 ------------loan_mapping-----------------

  loan_number |   spoc_id  | loan_spoc_map_id  | lob_id  | appName   

   222333          111          23                    5      SS
   222444          333          24                    5      SS
   222555          333          25                    5      SS
   333452          444          26                    5      SS
   777445          444          27                    5      SS

Ожидаемый результат:

 user_id
 ---------

   111
   444

Запрошенный мною запрос не дает ожидаемого результата

     select ui.user_id from user_info ui
         inner join user_skill lus on lus.skill_id = 156 and lus.user_id = 
              ui.user_id 
        inner join assignment_details ad on                     

        ui.lob_id=ad.lob_id and ui.user_id=ad.user_id and 
        ui.lob_id=5 and ui.status_id=2 where ad.lob_id=5 and 
      ad.role_id=11 and ad.assignment_status='Open' OR 
                        ( ad.assignment_status='Limited' 
   and ad.assignment_limited_threshold > ( select count(loan_number) 
                    from loan_mapping where lob_id=5 and  
             app_name ='SS'))

Можете ли вы написать запрос в соответствии с моиможидаемый результат? Заранее спасибо

1 Ответ

0 голосов
/ 11 ноября 2019

Попробуйте следующий запрос и дайте мне знать, если вы получаете какие-либо ошибки.

Вы должны сохранить скобки специально для условия OR.

Схема:

таблица user_info.

CREATE TABLE public.user_info(
        user_id integer NOT NULL,
         email_id character varying(255),
       user_name character varying(255),
       lob_id  integer NOT NULL,
        status_id integer,
       CONSTRAINT user_info_pkey PRIMARY KEY (user_id)
      ) 
    WITH (
     OIDS=FALSE
    );
INSERT INTO user_info VALUES(111,'abc','abc@gmail.com'  ,5,2);
INSERT INTO user_info VALUES(222,'def','def@gmail.com'  ,5,6);
INSERT INTO user_info VALUES(333,'ghi','ghi@gmail.com'  ,5,2);
INSERT INTO user_info VALUES(444,'jkl','jkl@hotmail.com',5,2);

таблица user_skill:

    CREATE TABLE public.user_skill
       (
         user_id integer NOT NULL,
         skill_id integer NOT NULL
)
   WITH (
       OIDS=FALSE
    );
INSERT INTO user_skill VALUES(111,156);
INSERT INTO user_skill VALUES(222,156);
INSERT INTO user_skill VALUES(333,156);
INSERT INTO user_skill VALUES(444,156);

таблица assignment_details:

         CREATE TABLE public.assignment_details
         (
           user_id integer NOT NULL,
          role_id integer NOT NULL,
         lob_id  integer NOT NULL,
         assignment_status character varying,
         assignment_limited_threshold integer,
          CONSTRAINT lsa_assignment_details_pkey PRIMARY KEY (user_id, 
        role_id, lob_id  )
       )
     WITH (
        OIDS=FALSE
   );

INSERT INTO assignment_details VALUES(111,11,5,'Open',NULL);
INSERT INTO assignment_details VALUES(222,11,5,'No',NULL   );
INSERT INTO assignment_details VALUES(333,11,5,'Limited',2);
INSERT INTO assignment_details VALUES(444,12,5,'Limited',10);

таблица loan_mapping:

         CREATE TABLE public.loan_mapping 
          (
        loan_number           bigint NOT NULL,
         spoc_id               integer NOT NULL,

       loan_spoc_map_id      integer NOT NULL,
          lob_id   integer,
            app_name VARCHAR(20),

      CONSTRAINT loan_spoc_mapping_pk PRIMARY KEY (loan_spoc_map_id)
  )
      WITH (
      OIDS=FALSE
  );
INSERT INTO loan_mapping VALUES(222333,111,23,5,'SS');
INSERT INTO loan_mapping VALUES(222444,333,24,5,'SS');
INSERT INTO loan_mapping VALUES(222555,333,25,5,'SS');
INSERT INTO loan_mapping VALUES(333452,444,26,5,'SS');
INSERT INTO loan_mapping VALUES(777445,444,27,5,'SS');

SQL-запрос:

select ui.user_id from user_info ui
         inner join user_skill lus on lus.skill_id = 156 and lus.user_id = 
              ui.user_id 
         left join 
         (select spoc_id,count(loan_number) loancount
                    from loan_mapping l where lob_id=5 and  
             app_name ='SS'
             group by spoc_id)uc on uc.spoc_id = ui.user_id
        inner join assignment_details ad on                     
        ui.lob_id=ad.lob_id and ui.user_id=ad.user_id and 
        ui.lob_id=5 and ui.status_id=2 where ad.lob_id=5 and 
      ad.role_id=11 and (ad.assignment_status='Open' OR 
                        (ad.assignment_status='Limited' 
   and ad.assignment_limited_threshold > uc.loancount))

И проверьте выходное значение в Ссылка SQL Fiddle

Возвращает следующие значениятолько.

Output
111
444
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...