Список уникальных контактов в строку

Показать список уникальных контактов в строку на конец работы каждого месяца по долгу.
Например:
по долгу id_debt = 123 на конец месяца 31.05.2014 будет результат: «обещание оплаты, бросили трубку, необходимо перезвонить»

Таблица контактов по долгу (id_contact – уникальное поле, связывается с другими таблицами по id_debt)

CONTACT
id_contact person_type id_debt id_date bound_type result_code contact_type promise_sum
1 1 123 02.05.2014 inbound необходимо перезвонить Контакт с должником
2 1 123 06.05.2014 outbound обещание оплаты Контакт с 3-м лицом 1000
3 1 123 12.05.2014 outbound бросили трубку Контакт с должником
4 2 123 17.05.2014 outbound необходимо перезвонить Контакт с 3-м лицом
5 1 123 21.05.2014 outbound бросили трубку Контакт с должником
6 1 123 31.05.2014 outbound бросили трубку Контакт с 3-м лицом
7 1 345 02.05.2014 inbound необходимо перезвонить Контакт с 3-м лицом
8 1 345 06.05.2014 outbound необходимо перезвонить Контакт с 3-м лицом
9 1 345 12.05.2014 outbound необходимо перезвонить Контакт с 3-м лицом
10 2 345 17.05.2014 outbound обещание оплаты Контакт с должником 3000
11 1 345 21.05.2014 outbound необходимо перезвонить Контакт с должником
12 1 345 31.05.2014 outbound необходимо перезвонить Контакт с должником

Создаём необходимые таблицы

CREATE TABLE "CONTACT" 
("ID_CONTACT" INTEGER, 
  "PERSON_TYPE" INTEGER, 
  "ID_DEBT" INTEGER,
  "DATE_CONTACT" DATE,
  "BOUND_TYPE" VARCHAR2(64),
  "RESULT_CODE" VARCHAR2(64),
  "CONTACT_TYPE" VARCHAR2(64),
  "PROMISE_SUM" NUMBER
) TABLESPACE MIRAVILD_DATA;
 
COMMENT ON COLUMN "CONTACT"."ID_CONTACT" IS 'Идентификатор контакта';
COMMENT ON COLUMN "CONTACT"."PERSON_TYPE" IS 'Тип лица (физическое/юридическое)';
COMMENT ON COLUMN "CONTACT"."ID_DEBT" IS 'Идентификатор долга';
COMMENT ON COLUMN "CONTACT"."DATE_CONTACT" IS 'Дата контакта';
COMMENT ON COLUMN "CONTACT"."BOUND_TYPE" IS 'Тип соединения (входящее/исходящее)';
COMMENT ON COLUMN "CONTACT"."RESULT_CODE" IS 'Результат контакта';
COMMENT ON COLUMN "CONTACT"."CONTACT_TYPE" IS 'Тип контакта';
COMMENT ON COLUMN "CONTACT"."PROMISE_SUM" IS 'Сумма обещания';
COMMENT ON TABLE "CONTACT" IS 'Контакт по долгу';
 
CREATE UNIQUE INDEX "CONTACT_U_IDX" ON "CONTACT" ("ID_CONTACT") TABLESPACE MIRAVILD_INDEX;

ALTER TABLE "CONTACT" ADD CONSTRAINT "CONTACT_PK" PRIMARY KEY ("ID_CONTACT")
  USING INDEX "CONTACT_U_IDX" ENABLE VALIDATE;
  
ALTER TABLE "CONTACT" MODIFY ("PERSON_TYPE" CONSTRAINT CONTACT_PERSON_TYPE_NN NOT NULL ENABLE);
ALTER TABLE "CONTACT" MODIFY ("ID_DEBT" CONSTRAINT CONTACT_ID_DEBT_NN NOT NULL ENABLE);
ALTER TABLE "CONTACT" MODIFY ("DATE_CONTACT" CONSTRAINT CONTACT_DATE_NN NOT NULL ENABLE);
ALTER TABLE "CONTACT" MODIFY ("BOUND_TYPE" CONSTRAINT CONTACT_BOUND_TYPE_NN NOT NULL ENABLE);
ALTER TABLE "CONTACT" MODIFY ("RESULT_CODE" CONSTRAINT CONTACT_RESULT_CODE_NN NOT NULL ENABLE);
ALTER TABLE "CONTACT" MODIFY ("CONTACT_TYPE" CONSTRAINT CONTACT_TYPE_NN NOT NULL ENABLE);
/

INSERT INTO CONTACT
Вариант запроса
Oracle 11g (LISTAGG)

SELECT c.id_debt,
       c.last_day,
       listagg(c.result_code, ',') within GROUP(ORDER BY c.id_debt) AS RESULT
  FROM (SELECT DISTINCT c.id_debt,
                        last_day(c.date_contact) AS last_day,
                        c.result_code
          FROM contact c) c
 GROUP BY c.id_debt, c.last_day;
/

Oracle 10g (STRAGG)

SELECT DISTINCT c.id_debt,
                c.last_day,
                sys.stragg(c.result_code || ', ') over(PARTITION BY c.id_debt, c.last_day) AS RESULT
  FROM (SELECT DISTINCT c.id_debt,
                        last_day(c.date_contact) AS last_day,
                        c.result_code
          FROM contact c) c
 ORDER BY c.id_debt;
/

Tags: ,

Leave a Reply

You must be logged in to post a comment.