powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Группировка(склеивание) значений одной группы
15 сообщений из 15, страница 1 из 1
Группировка(склеивание) значений одной группы
    #39344373
MegaDrag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Есть запрос, который выдает вот такие результаты

1005667402 21100 1225 21100 300
1005667402 21100 1225 21100 925

Как можно сделать так, чтобы он группировал определенные столбцы, если там значения одинаковые?
Примерно вот так чтобы выглядело
1005667402 21100 1225 21100 300
-------------- ------- ------ 21100 925
где ----- это пустое значение
...
Рейтинг: 0 / 0
Группировка(склеивание) значений одной группы
    #39344387
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это следует делать на стороне приложения.
STFF lag(null
...
Рейтинг: 0 / 0
Группировка(склеивание) значений одной группы
    #39344394
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
with t as (
           select 1005667402 c1,21100 c2,1225 c3,21100 c4,300 c5 from dual union all
           select 1005667402,21100,1225,21100,925 from dual
          )
select  case
          when lag(c1) over(order by c1,c2,c3,c4,c5) = c1 then null
          else c1
        end c1,
        case
          when lag(c2) over(order by c1,c2,c3,c4,c5) = c2 then null
          else c2
        end c2,
        case
          when lag(c3) over(order by c1,c2,c3,c4,c5) = c3 then null
          else c3
        end c3,
        case
          when lag(c4) over(order by c1,c2,c3,c4,c5) = c4 then null
          else c4
        end c4,
        case
          when lag(c5) over(order by c1,c2,c3,c4,c5) = c5 then null
          else c5
        end c5
  from  t
  order by c1,
           c2,
           c3,
           c4,
           c5
/

        C1         C2         C3         C4         C5
---------- ---------- ---------- ---------- ----------
1005667402      21100       1225      21100        300
                                                   925

SQL> 



SY.
...
Рейтинг: 0 / 0
Группировка(склеивание) значений одной группы
    #39344402
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соломон, lag самодостаточен.
...
Рейтинг: 0 / 0
Группировка(склеивание) значений одной группы
    #39344407
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicСоломон, lag самодостаточен.

Не понял.

SY.
...
Рейтинг: 0 / 0
Группировка(склеивание) значений одной группы
    #39344409
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYElicСоломон, lag самодостаточен.Не понял.А по ссылкам походить?
...
Рейтинг: 0 / 0
Группировка(склеивание) значений одной группы
    #39344422
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYElicСоломон, lag самодостаточен.

Не понял.

SY.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
  1  select ename,lag(null,1,job) over (partition by job order by job,ename) job_lag from emp
  2* order by job,ename
SQL> /

ENAME      JOB_LAG
---------- ---------
FORD       ANALYST
SCOTT
ADAMS      CLERK
JAMES
MILLER
SMITH
BLAKE      MANAGER
CLARK
JONES
KING       PRESIDENT
ALLEN      SALESMAN
MARTIN
TURNER
WARD

14 rows selected.




.....
stax
...
Рейтинг: 0 / 0
Группировка(склеивание) значений одной группы
    #39344434
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicА по ссылкам походить?

Прошелся. C LAG(NULL - буковок меньше, но вот эффективность хужe:

Код: 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.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
SQL> explain plan for with t as (
  2             select 1005667402 c1,21100 c2,1225 c3,21100 c4,300 c5 from dual union all
  3             select 1005667401,21100,1225,21100,925 from dual
  4            )
  5  select  lag(to_number(null),1,c1) over(partition by c1 order by c1,c2,c3,c4,c5) c1,
  6          lag(to_number(null),1,c2) over(partition by c2 order by c1,c3,c4,c5) c2,
  7          lag(to_number(null),1,c3) over(partition by c3 order by c1,c2,c4,c5) c3,
  8          lag(to_number(null),1,c4) over(partition by c4 order by c1,c2,c3,c5) c4,
  9          lag(to_number(null),1,c5) over(partition by c5 order by c1,c2,c3,c4) c5
 10    from  t
 11    order by c1 nulls last,
 12             c2 nulls last,
 13             c3 nulls last,
 14             c4 nulls last,
 15             c5 nulls last
 16  /

Explained.

SQL> set linesize 132
SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------
Plan hash value: 3764458696

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     2 |    34 |    10  (60)| 00:00:01 |
|   1 |  SORT ORDER BY     |      |     2 |    34 |    10  (60)| 00:00:01 |
|   2 |   WINDOW SORT      |      |     2 |    34 |    10  (60)| 00:00:01 |
|   3 |    WINDOW SORT     |      |     2 |    34 |    10  (60)| 00:00:01 |
|   4 |     WINDOW SORT    |      |     2 |    34 |    10  (60)| 00:00:01 |
|   5 |      WINDOW SORT   |      |     2 |    34 |    10  (60)| 00:00:01 |
|   6 |       WINDOW SORT  |      |     2 |    34 |    10  (60)| 00:00:01 |
|   7 |        VIEW        |      |     2 |    34 |     4   (0)| 00:00:01 |
|   8 |         UNION-ALL  |      |       |       |            |          |
|   9 |          FAST DUAL |      |     1 |       |     2   (0)| 00:00:01 |
|  10 |          FAST DUAL |      |     1 |       |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------

17 rows selected.

SQL> explain plan for
  2  with t as (
  3             select 1005667402 c1,21100 c2,1225 c3,21100 c4,300 c5 from dual union all
  4             select 1005667401,21100,1225,21100,925 from dual
  5            )
  6  select  case
  7            when lag(c1) over(order by c1,c2,c3,c4,c5) = c1 then null
  8            else c1
  9          end c1,
 10          case
 11            when lag(c2) over(order by c1,c2,c3,c4,c5) = c2 then null
 12            else c2
 13          end c2,
 14          case
 15            when lag(c3) over(order by c1,c2,c3,c4,c5) = c3 then null
 16            else c3
 17          end c3,
 18          case
 19            when lag(c4) over(order by c1,c2,c3,c4,c5) = c4 then null
 20            else c4
 21          end c4,
 22          case
 23            when lag(c5) over(order by c1,c2,c3,c4,c5) = c5 then null
 24            else c5
 25          end c5
 26    from  t
 27    order by c1 nulls last,
 28             c2 nulls last,
 29             c3 nulls last,
 30             c4 nulls last,
 31             c5 nulls last
 32  /

Explained.

SQL> set linesize 132
SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 4281479882

-------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     2 |    34 |     6  (34)| 00:00:01 |
|   1 |  SORT ORDER BY   |      |     2 |    34 |     6  (34)| 00:00:01 |
|   2 |   WINDOW SORT    |      |     2 |    34 |     6  (34)| 00:00:01 |
|   3 |    VIEW          |      |     2 |    34 |     4   (0)| 00:00:01 |
|   4 |     UNION-ALL    |      |       |       |            |          |
|   5 |      FAST DUAL   |      |     1 |       |     2   (0)| 00:00:01 |
|   6 |      FAST DUAL   |      |     1 |       |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------

13 rows selected.

SQL>



SY.
...
Рейтинг: 0 / 0
Группировка(склеивание) значений одной группы
    #39344442
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и результат при наличии полных дублей:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with t as (
           select 1005667402 c1,21100 c2,1225 c3,21100 c4,300 c5 from dual union all
           select 1005667402,21100,1225,21100,300 from dual
          )
select  lag(to_number(null),1,c1) over(partition by c1 order by c1,c2,c3,c4,c5) c1,
        lag(to_number(null),1,c2) over(partition by c2 order by c1,c3,c4,c5) c2,
        lag(to_number(null),1,c3) over(partition by c3 order by c1,c2,c4,c5) c3,
        lag(to_number(null),1,c4) over(partition by c4 order by c1,c2,c3,c5) c4,
        lag(to_number(null),1,c5) over(partition by c5 order by c1,c2,c3,c4) c5
  from  t
  order by c1 nulls last,
           c2 nulls last,
           c3 nulls last,
           c4 nulls last,
           c5 nulls last
/

        C1         C2         C3         C4         C5
---------- ---------- ---------- ---------- ----------
1005667402                  1225                   300
                21100                 21100

SQL> 



SY.
...
Рейтинг: 0 / 0
Группировка(склеивание) значений одной группы
    #39344453
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYДа и результат при наличии полных дублей:


С этим разобрался:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with t as (
           select 1005667402 c1,21100 c2,1225 c3,21100 c4,300 c5 from dual union all
           select 1005667402,21100,1225,21100,300 from dual
          )
select  lag(to_number(null),1,c1) over(partition by c1 order by c1,c2,c3,c4,c5) c1,
        lag(to_number(null),1,c2) over(partition by c1,c2 order by c3,c4,c5) c2,
        lag(to_number(null),1,c3) over(partition by c1,c2,c3 order by c4,c5) c3,
        lag(to_number(null),1,c4) over(partition by c1,c2,c3,c4 order by c5) c4,
        lag(to_number(null),1,c5) over(partition by c1,c2,c3,c4,c5 order by 1) c5
  from  t
  order by c1 nulls last,
           c2 nulls last,
           c3 nulls last,
           c4 nulls last,
           c5 nulls last
/

        C1         C2         C3         C4         C5
---------- ---------- ---------- ---------- ----------
1005667402      21100       1225      21100        300


SQL> 



Что и проблему window sort решило:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------
Plan hash value: 4281479882

-------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     2 |    34 |     6  (34)| 00:00:01 |
|   1 |  SORT ORDER BY   |      |     2 |    34 |     6  (34)| 00:00:01 |
|   2 |   WINDOW SORT    |      |     2 |    34 |     6  (34)| 00:00:01 |
|   3 |    VIEW          |      |     2 |    34 |     4   (0)| 00:00:01 |
|   4 |     UNION-ALL    |      |       |       |            |          |
|   5 |      FAST DUAL   |      |     1 |       |     2   (0)| 00:00:01 |
|   6 |      FAST DUAL   |      |     1 |       |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------

13 rows selected.

SQL> 



Так-что да, решение LAG(NULL от Elica лучше.

SY.
...
Рейтинг: 0 / 0
Группировка(склеивание) значений одной группы
    #39344683
MegaDrag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, lag(null помог
Если не сложно, то подскажите еще пожалуйста как можно решить вот такой вопрос.
Есть запрос, который выводит значения кодов и сумм из одной таблицы , и значения кодов и сумм из другой в рамках одного документа при условии, что не равны коды, или не равны суммы в документах(т.е на основании документа делается операция в одной таблице, а потом на основании этого же документа делается операция в другой таблице, и нужно искать расхождения,если таковые есть)
Пример:
1007153595 21400 25209,95 21400 15165,42 --коды равны, но суммы не равны
1007153595 21401 1422,58 21400 1422,58 --коды не равны,но суммы равны

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

1007153595 21400 25209,95 21400 15165,42 --коды равны, но суммы не равны
1007153595 21401 1422,58 21400 1422,58 --коды не равны,но суммы равны
1007153595 35040 25200 --данные для 4 и 5 столбца брать неоткуда

При проверка условия получается что последняя запись попадает и под первое условия(когда коды равны, но суммы не равны) и под второе(когда коды не равны, но суммы равны) и сравнивает свои значения в рамках одного документа с другими записями и выводит лишнее

Как можно дополнить условие проверки, чтобы если в рамках документа нету соответствия ни по сумме,ни по коду,то выводить к примеру NULL
Т.е вот так
1007153595 21400 25209,95 21400 15165,42 --коды равны, но суммы не равны
1007153595 21401 1422,58 21400 1422,58 --коды не равны,но суммы равны
1007153595 35040 25200 Null Null --данные для 4 и 5 столбца брать неоткуда
...
Рейтинг: 0 / 0
Группировка(склеивание) значений одной группы
    #39345017
MegaDrag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Up
...
Рейтинг: 0 / 0
Группировка(склеивание) значений одной группы
    #39345022
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MegaDragКак можно дополнить условие проверкиЧтобы что-нибудь дополнить, чудило, надо это самое что-нибудь иметь.
http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM
...
Рейтинг: 0 / 0
Группировка(склеивание) значений одной группы
    #39345061
MegaDrag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот код select oa.docassoc as Classified_pp,ct.code as Kod_VO_UZVO,cc.amount as Summa_UZVO ,ctt.code as Kov_VO_402, cb.amount as Summa_402
from objassoc oa,doctree dt, controlmain cm, currencytransaction ct,controlcurrency cc, cb_f402 cb, currencytransaction ctt
where oa.assoc=dt.classified
and oa.obj=cm.doc
and oa.assoc=1007153595
and cm.vocode=ct.classified
and cb.vocode=ctt.classified
and oa.obj=cc.doc
and cc.linktype=1
and oa.assoc=cb.doc
and dt.docstate=1000000035
and ct.code is not null
and ct.code!=ctt.code
And Not Exists (Select 1 From Cb_F402 Cb
Where Cb.Amount=cc.Amount
and cb.VoCode =Cm.VoCode
and cb.Doc=Dt.Classified )
...
Рейтинг: 0 / 0
Группировка(склеивание) значений одной группы
    #39345071
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз ты не умеешь предоставлять test-case-ы, то тебе в форум Работа. Может там, за деньги, захотят попытаться понять тебя.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Группировка(склеивание) значений одной группы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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