Показать список уникальных контактов в строку на конец работы каждого месяца по долгу.
Например:
по долгу id_debt = 123 на конец месяца 31.05.2014 будет результат: «обещание оплаты, бросили трубку, необходимо перезвонить»
Таблица контактов по долгу (id_contact – уникальное поле, связывается с другими таблицами по id_debt)
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; /