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 đó.