sql >> Databáze >  >> RDS >> Oracle

jak spojit dvě různé hodnoty z jedné tabulky jednoho zákazníka do jednoho řádku

Musíte GROUP BY id a podmínka "více než jedna objednávka" přejde do HAVING klauzule (protože jde o omezení pro každou skupinu, nikoli pro každý jednotlivý řádek ve vstupních datech). Agregace se provádí pomocí 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

V Oracle 10 však nemáte LISTAGG() . Před Oracle 11.2 bylo běžným způsobem, jak získat stejný výsledek, použití hierarchických dotazů, něco jako níže:

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
;

UPRAVENO :

Pokud je třeba nejprve "odlišit" opakovaný KÓD pro stejné ID, pak - pomocí druhého řešení - jsou nutné následující změny, a to jak v nejvnitřnějším poddotazu:

  • změnit SELECT ID, CODE, ... na SELECT DISTINCT ID, CODE, ...

  • změnit ROW_NUMBER() na DENSE_RANK()




  1. PHP nevidí rozšíření mysql

  2. Jak FROM_BASE64() funguje v MariaDB

  3. Závažná chyba při volání funkce uložené v MySQL z PHP pomocí MySQLi

  4. Nejlepší způsob, jak zkontrolovat, zda mysql_query vrátil nějaké výsledky?