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

Tổng hợp chuỗi Oracle

Tôi sẽ giả định rằng PRIORITY cột luôn là 1 khi có "sản phẩm chính" và không bao giờ là 1 bất kỳ lúc nào khác. Từ dữ liệu của bạn, có vẻ như mỗi khách hàng chỉ có một sản phẩm "chính". Tôi sẽ giả định rằng điều này là đúng. Nếu không thì bạn nên có một cột khác để phân biệt các nhóm sản phẩm. Bạn có thể chỉ cần thêm điều này vào bên dưới.

Câu trả lời phức tạp / hiệu quả có thể như sau:

select customer
     , max(product) keep (dense_rank first order by priority) as main_product
     , listagg(case when priority = 2 then product end, ', ')
         within group (order by product) as sub_product
  from products
 group by customer

SQL Fiddle

Đối với mỗi khách hàng, PRODUCT giả định rằng mọi khách hàng đều có sản phẩm chính, sau đó nhận sản phẩm đầu tiên theo thứ tự ưu tiên. Cột thứ hai chỉ chiếm mức độ ưu tiên là 2 và sử dụng hàm nối chuỗi LISTAGG () để nối các giá trị của bạn với nhau.

Tôi thực sự giới thiệu bài đăng trên blog của Rob van Wijk về điều khoản KEEP.

Một giải pháp SQL tiêu chuẩn hơn sẽ giống như sau:

select a.customer, a.product as main_product
     , listagg(b.product, ', ') within group (order by b.product) as sub_product
  from products a
  join products b
    on a.customer = b.customer
 where a.priority = 1
   and b.priority = 2
 group by a.customer, a.product

tức là tìm mọi thứ có mức độ ưu tiên là 1, sử dụng quyền này để tạo hai hàng của bạn và sau đó lấy mọi thứ có mức độ ưu tiên là 2 và tổng hợp các hàng đó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết nối Oracle với Amazon Aurora

  2. Làm thế nào để Chọn một chuỗi con trong Oracle SQL cho đến một ký tự cụ thể?

  3. Cập nhật bản vá quan trọng của Oracle - tháng 10 năm 2020

  4. Cách trả lại số giây phân số từ giá trị ngày giờ trong Oracle

  5. Hàm DATEDIFF trong Oracle