powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / listagg+distinct
25 сообщений из 39, страница 1 из 2
listagg+distinct
    #38669757
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работают вместе или только через подзапросы?
...
Рейтинг: 0 / 0
listagg+distinct
    #38669774
29 Белых Котиков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

Не работают. Надо писать свою агрегирующую функцию, либо использовать wm_concat, либо использовать подзапросы.
...
Рейтинг: 0 / 0
listagg+distinct
    #38669795
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Расстроили вы меня, все 29-еро
...
Рейтинг: 0 / 0
listagg+distinct
    #38669878
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать regexp'ом (нашел на просторах инета)
Код: plsql
1.
select regexp_replace(listagg(<поле>, ';') within group (order by <поле>),'([^;]+)(;\1)+', '\1') alias from table
...
Рейтинг: 0 / 0
listagg+distinct
    #38669880
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MazoHistМожно попробовать regexp'ом (нашел на просторах инета)
Код: plsql
1.
select regexp_replace(listagg(<поле>, ';') within group (order by <поле>),'([^;]+)(;\1)+', '\1') alias from table

увеличивается возможность переполнения
...
Рейтинг: 0 / 0
listagg+distinct
    #38669888
29 Белых Котиков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, distinct с order by даже в collect не работают

Вот так собирает различные элементы в группе

Код: plsql
1.
2.
3.
4.
5.
6.
select a, collect(distinct l) l 
from (
    select upper(substr(object_name,1,1)) as a, mod(object_id,10) as l 
    from all_objects
) test_source 
group by a



А вот так условие distinct игнорирует, зато сортирует

Код: plsql
1.
2.
3.
4.
5.
6.
select a, collect(distinct l order by l desc) l 
from (
    select upper(substr(object_name,1,1)) as a, mod(object_id,10) as l 
    from all_objects
) test_sourcec 
group by a
...
Рейтинг: 0 / 0
listagg+distinct
    #38670490
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

dist2
...
Рейтинг: 0 / 0
listagg+distinct
    #38686865
йцу1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MazoHistМожно попробовать regexp'ом (нашел на просторах инета)
Код: plsql
1.
select regexp_replace(listagg(<поле>, ';') within group (order by <поле>),'([^;]+)(;\1)+', '\1') alias from table

кривой регексп
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SQL> with t as
  2  (
  3   select '170,171,172' txt from dual union all
  4   select '170,171,171,172' from dual
  5  )
  6  select txt, regexp_replace(txt, '([^,]+)(,\1)+', '\1') result from t;

TXT             RESULT
--------------- --------------------------------------------------------------------------------
170,171,172     170,17172
170,171,171,172 170,171,172
...
Рейтинг: 0 / 0
listagg+distinct
    #38808178
demid-d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
йцу1,
а вот так уже работает

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> with t as
  2   (select '170, 171, 172' txt
  3      from dual
  4    union all
  5    select '170, 171, 171, 172'
  6      from dual)
  7  select txt,
  8         regexp_replace(txt, '([^,]+)(,\1)+', '\1') result
  9    from t;

TXT                         RESULT
------------------        ----------------------------------------------
170, 171, 172           170, 171, 172
170, 171, 171, 172    170, 171, 172
...
Рейтинг: 0 / 0
listagg+distinct
    #38808193
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demid-dйцу1,
а вот так уже работает

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> with t as
  2   (select '170, 171, 172' txt
  3      from dual
  4    union all
  5    select '170, 171, 171, 172'
  6      from dual)
  7  select txt,
  8         regexp_replace(txt, '([^,]+)(,\1)+', '\1') result
  9    from t;

TXT                         RESULT
------------------        ----------------------------------------------
170, 171, 172           170, 171, 172
170, 171, 171, 172    170, 171, 172

это до тех пор, пока внутренний результат ограничивается 4-кб
...
Рейтинг: 0 / 0
listagg+distinct
    #38808228
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxэто до тех пор, пока внутренний результат ограничивается 4-кба после тех пор результат listagg не ограничивается?
...
Рейтинг: 0 / 0
listagg+distinct
    #38808495
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
йцу1кривой регексп


Жадный он а не кривой :

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SCOTT@orcl > with t as (
  2             select '170,171,172' txt from dual union all
  3             select '170,171,171,172' from dual
  4            )
  5  select  txt,
  6          regexp_replace(txt,'([^,]+)(,\1)+','\1') greedy_result,
  7          regexp_replace(txt,'([^,]+)(,\1)?+','\1') non_greedy_result
  8    from  t
  9  /

TXT             GREEDY_RESULT        NON_GREEDY_RESULT
--------------- -------------------- --------------------
170,171,172     170,17172            170,171,172
170,171,171,172 170,171,172          170,171,172

SCOTT@orcl > 



SY.
...
Рейтинг: 0 / 0
listagg+distinct
    #38808679
Den89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
29 Белых КотиковВообще, distinct с order by даже в collect не работают

Distinct с collect только в sql-контексте работают. В Pl/Sql уже нет, приходится execute immediate использовать.

Очень часто distinct-order-collect можно заменить на cast-multiset.
...
Рейтинг: 0 / 0
listagg+distinct
    #38808762
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-andreymxэто до тех пор, пока внутренний результат ограничивается 4-кба после тех пор результат listagg не ограничивается?имел в виду, что там, где какой-нить StrAgg(Distinct) мог бы отработать, regexp_replace(listagg( с такой же легкостью может свалиться
...
Рейтинг: 0 / 0
listagg+distinct
    #38816553
RenVold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создал таблицы TRANSACT_TEST.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE transact_test
    (id                             NUMBER(11,0) NOT NULL,
    id_client                      NUMBER(11,0),
    id_message                     NUMBER(11,0),
    summa                          FLOAT(10),
    data_transact                  DATE,
    m_number                       NUMBER(11,0))



Наполнил ее.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
INSERT INTO transact_test 
VALUES(217248,20940,133588,-150,TO_DATE('2014-09-19 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),2126);
INSERT INTO transact_test 
VALUES(217742,20940,133588,150,TO_DATE('2014-09-26 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),2126);
INSERT INTO transact_test 
VALUES(214748,20940,139946,-180,TO_DATE('2014-09-05 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3107);
INSERT INTO transact_test 
VALUES(217800,20940,139946,180,TO_DATE('2014-09-27 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3107);
INSERT INTO transact_test 
VALUES(214749,20940,139947,-180,TO_DATE('2014-09-05 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3108);
INSERT INTO transact_test 
VALUES(217799,20940,139947,180,TO_DATE('2014-09-27 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3108);
INSERT INTO transact_test 
VALUES(214753,20940,139949,-180,TO_DATE('2014-09-05 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3109);
INSERT INTO transact_test 
VALUES(217798,20940,139949,180,TO_DATE('2014-09-27 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3109);
INSERT INTO transact_test 
VALUES(217523,13504,140265,200,TO_DATE('2014-09-24 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3190);
INSERT INTO transact_test 
VALUES(215075,13504,140265,-200,TO_DATE('2014-09-10 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3190);
INSERT INTO transact_test 
VALUES(217801,20940,140478,200,TO_DATE('2014-09-27 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3244);
INSERT INTO transact_test 
VALUES(215328,20940,140478,-200,TO_DATE('2014-09-12 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3244);
INSERT INTO transact_test 
VALUES(217524,13504,140655,200,TO_DATE('2014-09-24 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3279);
INSERT INTO transact_test 
VALUES(215484,13504,140655,-200,TO_DATE('2014-09-15 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3279);
INSERT INTO transact_test 
VALUES(217807,20940,141133,180,TO_DATE('2014-09-27 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3413);
INSERT INTO transact_test 
VALUES(216510,20940,141133,-180,TO_DATE('2014-09-19 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3413);
INSERT INTO transact_test 
VALUES(216518,20940,141134,-180,TO_DATE('2014-09-19 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3415);
INSERT INTO transact_test 
VALUES(217803,20940,141134,180,TO_DATE('2014-09-27 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3415);
INSERT INTO transact_test 
VALUES(216527,20940,141135,-180,TO_DATE('2014-09-19 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3417);
INSERT INTO transact_test 
VALUES(217802,20940,141135,180,TO_DATE('2014-09-27 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3417);
INSERT INTO transact_test 
VALUES(217804,20940,141136,180,TO_DATE('2014-09-27 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3419);
INSERT INTO transact_test 
VALUES(216532,20940,141136,-180,TO_DATE('2014-09-19 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3419);
INSERT INTO transact_test 
VALUES(217805,20940,141137,180,TO_DATE('2014-09-27 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3425);
INSERT INTO transact_test 
VALUES(216548,20940,141137,-180,TO_DATE('2014-09-19 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3425);
INSERT INTO transact_test 
VALUES(216561,20940,141138,-180,TO_DATE('2014-09-19 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3426);
INSERT INTO transact_test 
VALUES(217806,20940,141138,180,TO_DATE('2014-09-27 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3426);
INSERT INTO transact_test 
VALUES(217458,13504,141293,-200,TO_DATE('2014-09-23 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3491);
INSERT INTO transact_test 
VALUES(217459,13504,141294,-200,TO_DATE('2014-09-23 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3493);
INSERT INTO transact_test 
VALUES(217713,20940,141458,-180,TO_DATE('2014-09-26 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3851);
INSERT INTO transact_test 
VALUES(217714,20940,141459,-180,TO_DATE('2014-09-26 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),3852);



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE client_test
    (id                             NUMBER(*,0),
    fio                            NVARCHAR2(152),
    adres                          NVARCHAR2(125),
    telefon                        NVARCHAR2(50),
    c_comment                      VARCHAR2(4000 BYTE),
    c_balance                      FLOAT(10),
    olddolg                        NUMBER(1,0),
    mobile                         VARCHAR2(20 CHAR),
    netusers                       NUMBER)



Наполнил...

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
INSERT INTO client_test 
VALUES(981,'Никифоров С. Г.','г. НеЗнайГде ул.Н-Чапаевская д.147 кв.','41511',NULL,0,0,NULL,NULL);
INSERT INTO client_test 
VALUES(10356,'Шатилова М. В.','г. НеЗнайГде ул.13 Линия д.63 кв.','52732',NULL,0,0,NULL,NULL);
INSERT INTO client_test 
VALUES(13504,'Бутакова Л. В.','г. НеЗнайГде ул.5 Линия д.14 кв.','50199',NULL,-150,0,NULL,NULL);
INSERT INTO client_test 
VALUES(983,'Цымбалюк В. С.','г. ЗнайГде ул.Н-Уральская д.62 кв.','44247',NULL,0,0,NULL,NULL);
INSERT INTO client_test 
VALUES(20940,'Андросов А. С.','г. ЗнайГде ул.Галактионова д.58 кв.6','24392',NULL,-510,0,NULL,NULL);



Задача:
Нужно найти всех должников и вывести через запятую только те позиции, которые не оплачены. Т.е. MS_NUMBER через запятую.

Если выполнить простой селект

Код: plsql
1.
SELECT*  FROM transact_test order by id_client,  m_number



Видим.

ID ID_CLIENT ID_MESSAGE SUMMA DATA_TRANSACT M_NUMBER217523 13504 140265 200 24-сен-2014 3190215075 13504 140265 -200 10-сен-2014 3190215484 13504 140655 -200 15-сен-2014 3279217524 13504 140655 200 24-сен-2014 3279217458 13504 141293 -200 23-сен-2014 3491 217459 13504 141294 -200 23-сен-2014 3493 217248 20940 133588 -150 19-сен-2014 2126217742 20940 133588 150 26-сен-2014 2126217800 20940 139946 180 27-сен-2014 3107214748 20940 139946 -180 05-сен-2014 3107217799 20940 139947 180 27-сен-2014 3108214749 20940 139947 -180 05-сен-2014 3108214753 20940 139949 -180 05-сен-2014 3109217798 20940 139949 180 27-сен-2014 3109217801 20940 140478 200 27-сен-2014 3244215328 20940 140478 -200 12-сен-2014 3244216510 20940 141133 -180 19-сен-2014 3413217807 20940 141133 180 27-сен-2014 3413216518 20940 141134 -180 19-сен-2014 3415217803 20940 141134 180 27-сен-2014 3415217802 20940 141135 180 27-сен-2014 3417216527 20940 141135 -180 19-сен-2014 3417217804 20940 141136 180 27-сен-2014 3419216532 20940 141136 -180 19-сен-2014 3419217805 20940 141137 180 27-сен-2014 3425216548 20940 141137 -180 19-сен-2014 3425216561 20940 141138 -180 19-сен-2014 3426217806 20940 141138 180 27-сен-2014 3426217713 20940 141458 -180 26-сен-2014 3851 217714 20940 141459 -180 26-сен-2014 3852


Выделенные жирным означают, что по этим позициям оплаты не было. (Нет пары у нее) И те, что жирным выделены должны отобразиться через запятую и показать суммарный долг по этим позициям.

Т.е. хочу получить вот такой результат. (в столбце MS_NUMBER вместо точек - запятая)

CLIENT MS_NUMBER TR_DATA FIO TELEFON ADRES DOLG20940 3851. 3852 26.сен.14 Андросов А. С. 24392 г. НеЗнай Где ул.Галактионова д.58 кв.6 -36013504 3491. 3493 23.сен.14 Бутакова Л. В. 50199 г. ЗнайГде ул.5 Линия д.14 кв. -400

Я попытался самостоятельно написать селект, который по идее должен дать результат как в приведенной таблице.
Написал...

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT wm_concat(distinct tr.id_client) AS client,
       wm_concat (distinct tr.m_number) AS ms_number,
wm_concat (distinct trunc(tr.data_transact)) AS tr_data,       
clt.fio, clt.telefon,
       clt.adres,       
       sum(tr.summa) as dolg
  FROM transact_test tr, client_test clt 
WHERE (tr.data_transact BETWEEN TO_DATE ('01.09.2014', 'dd.mm.yyyy') AND TO_DATE ('30.09.2014', 'dd.mm.yyyy')) 
 and tr.id_client=clt.id                   
                   HAVING SUM (tr.summa) < 0
                   group by tr.id_client, clt.fio, clt.adres, clt.telefon
                   order by clt.fio



Возвращает мне вот такую фигню.... (хотя это может и не фигня, а фигня в моей голове)

CLIENT MS_NUMBER TR_DATA FIO TELEFON ADRES DOLG20940 2126.3107.3108.3109.3244.3413.3415.3417.3419.3425.3426.3851.3852 05-Сен-2014.12-Сен-2014.19-Сен-2014.26-Сен-2014.27-Сен-2014 Андросов А. С. 24392 г. ЗнайГде ул.Галактионова д.58 кв.6 -36013504 3190.3279.3491.3493 10-Сен-2014.15-Сен-2014.23-Сен-2014.24-Сен-2014 Бутакова Л. В. 50199 г. НеЗнайГде ул.5 Линия д.14 кв. -400


Меня это не устраивает. Как мне привести в тот вид, который показан в первой табличке?
...
Рейтинг: 0 / 0
listagg+distinct
    #38816563
RenVold, слово аналитика у тя с чемнить еще ассоциируется?
...
Рейтинг: 0 / 0
listagg+distinct
    #38816567
RenVold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПроктологъRenVold, слово аналитика у тя с чемнить еще ассоциируется?

Ассоциируется, ассоциируется! Но я не могу что то как то правильно составить . Помогли бы лучше, чем сарказм проявляли (((
...
Рейтинг: 0 / 0
listagg+distinct
    #38816588
RenVold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя бы подскажите в каком направлении копать. Какую аналитику использовать
...
Рейтинг: 0 / 0
listagg+distinct
    #38816600
На форуме есть некто guest_smetanka. Она всем дает. Если же дождаться невтерпеж, то даю подсказку: вынеси мусор один единственный конкат во внешний подзапрос
...
Рейтинг: 0 / 0
listagg+distinct
    #38816607
RenVoldКакую аналитику использоватьС аналитикой пожалуй будет излишне. Она будет считать все. А тут только долгами ограничиться хватит
...
Рейтинг: 0 / 0
listagg+distinct
    #38816612
Фотография MonteCarlos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проктологъ,
давай, чувак, путай его, чем дольше RenVold пишет запрос, тем больше времени у Андросова и Бутаковой достать деньги
...
Рейтинг: 0 / 0
listagg+distinct
    #38816622
MonteCarlosПроктологъ,
давай, чувак, путай его, чем дольше RenVold пишет запрос, тем больше времени у Андросова и Бутаковой достать деньгиПутать будеш свою бабушку объясняя куда девалась ее пенсия, а разжевывать и ротврот передавать кашицу - свои птенцам когда вырастешь
...
Рейтинг: 0 / 0
listagg+distinct
    #38816625
RenVold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Жалко, что LISTAGG не дружит с DISTINCT ((( мне б проще задачу было бы решить.... Есть у кого какие мысли?

По идее надо какой то сложнющий запрос строить. Логика такая.

1 ) Находим все записи, которые попадают в период с 01.09.2014 по 30.09.2014.
2) Проходимся по каждому клиенту, группируем все записи клиента по id_message и суммируем SUM(SUMMA) по каждой группе id_message - если плюс на минус, не берем. Если минус - берем (если плюс - тоже не берем. только минусы)
3) Склеиваем через запятую все найденные записи
4) Также делаем автосумму по всем id_message, которые принадлежат одному клиенту.


Как то так... Такой набросок плана.

А вот как изящно и красиво написать селект ... чет никак ((( Хотя в PL/SQL Я вроде не чайник ((((
...
Рейтинг: 0 / 0
listagg+distinct
    #38816628
RenVold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПроктологъНа форуме есть некто guest_smetanka. Она всем дает. Если же дождаться невтерпеж, то даю подсказку: вынеси мусор один единственный конкат во внешний подзапрос

Щас попробую.... Ты наверное, имел ввиду "лишний конкат" - это ".... wm_concat (distinct trunc(tr.data_transact)) AS tr_data ..."
...
Рейтинг: 0 / 0
listagg+distinct
    #38816629
RenVold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПроктологъRenVoldКакую аналитику использоватьС аналитикой пожалуй будет излишне. Она будет считать все. А тут только долгами ограничиться хватит

Неет! Не только! Обязательно нужны через запятую все номера, которые заказал клиент (чтоб он видел за какие номера он платит), его фио, адрес (куда квитанцию прислать) ну и конечно же его общий долг за взятый период
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / listagg+distinct
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]