Oracle
 sql >> база данни >  >> RDS >> Oracle

как да комбинирате две различни стойности от една таблица на един клиент в един ред

Трябва да GROUP BY id и условието за „повече от една поръчка“ преминава в HAVING клауза (защото това е ограничение за всяка група, а не за всеки отделен ред във входните данни). Обединяването се извършва с LISTAGG .

with
     test_data ( id, product, code ) as (
       select 1, 'Apple' , 145 from dual union all
       select 1, 'Grapes', 146 from dual union all
       select 2, 'Orange', 147 from dual union all
       select 2, 'Apple' , 145 from dual union all
       select 2, 'Plum'  , 148 from dual union all
       select 3, 'Grapes', 146 from dual union all
       select 3, 'Orange', 147 from dual union all
       select 4, 'Grapes', 146 from dual union all
       select 5, 'Orange', 147 from dual
     )
--  End of test data (not part of the solution). Query begins below this line.
select   id, listagg(code, ' | ') within group (order by id) as codes
from     test_data
group by id
having   count(*) > 1
;

ID  CODE
--  ---------------
 1  145 | 146
 2  145 | 147 | 148
 3  146 | 147

В Oracle 10 обаче нямате LISTAGG() . Преди Oracle 11.2 често срещан начин за получаване на същия резултат беше използването на йерархични заявки, нещо като по-долу:

select id, ltrim(sys_connect_by_path(code, ' | '), ' | ') as codes
from   (
         select id, code,
                row_number() over (partition by id order by code) as rn
         from   test_data
       )
where connect_by_isleaf = 1 and level > 1
connect by rn = prior rn + 1
       and prior id = id
       and prior sys_guid() is not null
start with rn = 1
;

РЕДАКТИРАНО :

Ако повтарящият се КОД за един и същ идентификатор трябва първо да бъде „разграничен“, тогава – като се използва второто решение – са необходими следните промени, и двете в най-вътрешната подзаявка:

  • промяна на SELECT ID, CODE, ... към SELECT DISTINCT ID, CODE, ...

  • промяна на ROW_NUMBER() към DENSE_RANK()




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. искам да приема въвеждане от потребителя в PL SQL и да го предам на процедура, покажете ми проста програма за това?

  2. Oracle PL/SQL версии на INET6_ATON и NTOA функции?

  3. Актуализирайте множество колони въз основа на процентно изчисление в Oracle

  4. Непоследователно транспониране

  5. Заявка за свързване на множество таблици в Oracle SQL плюс 11g