Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

cách kết hợp hai giá trị khác nhau từ một bảng của một khách hàng thành một hàng

Bạn cần GROUP BY id và điều kiện về "nhiều đơn hàng" chuyển thành HAVING mệnh đề (vì nó là một ràng buộc trên từng nhóm, không phải trên từng hàng riêng lẻ trong dữ liệu đầu vào). Việc tổng hợp được thực hiện với 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

Tuy nhiên, trong Oracle 10, bạn không có LISTAGG() . Trước Oracle 11.2, một cách phổ biến để có được kết quả tương tự là sử dụng các truy vấn phân cấp, giống như sau:

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
;

ĐÃ CHỈNH SỬA :

Nếu CODE lặp lại cho cùng một ID cần phải được "loại bỏ" trước, sau đó - sử dụng giải pháp thứ hai - cần thực hiện các thay đổi sau, cả trong truy vấn con trong cùng:

  • thay đổi SELECT ID, CODE, ... thành SELECT DISTINCT ID, CODE, ...

  • thay đổi ROW_NUMBER() thành 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. SQL Chọn giá trị MIN từ dữ liệu hàng có giá trị rỗng

  2. Cách tạo con trỏ tham chiếu yếu PL / SQL trong cơ sở dữ liệu Oracle

  3. Giới thiệu về gói PL / SQL trong cơ sở dữ liệu Oracle

  4. Truy vấn SQL để trả về một hàng ngay cả khi không tìm thấy, với ít nhất là trong các tham số

  5. Oracle SQL:các biến được sử dụng thay cho tên bảng