Rất tiếc, MySQL không có PIVOT
về cơ bản là những gì bạn đang cố gắng thực hiện. Vì vậy, bạn sẽ cần sử dụng một hàm tổng hợp với CASE
tuyên bố:
select pt.partner_name,
count(case when pd.product_name = 'Product A' THEN 1 END) ProductA,
count(case when pd.product_name = 'Product B' THEN 1 END) ProductB,
count(case when pd.product_name = 'Product C' THEN 1 END) ProductC,
count(case when pd.product_name = 'Product D' THEN 1 END) ProductD,
count(case when pd.product_name = 'Product E' THEN 1 END) ProductE
from partners pt
left join sales s
on pt.part_id = s.partner_id
left join products pd
on s.product_id = pd.prod_id
group by pt.partner_name
Vì bạn không biết Sản phẩm nên có thể bạn sẽ muốn thực hiện việc này một cách linh hoạt. Điều này có thể được thực hiện bằng cách sử dụng các câu lệnh đã chuẩn bị sẵn.
Với bảng tổng hợp động (chuyển đổi hàng thành cột), mã của bạn sẽ giống như sau:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'count(case when Product_Name = ''',
Product_Name,
''' then 1 end) AS ',
replace(Product_Name, ' ', '')
)
) INTO @sql
from products;
SET @sql = CONCAT('SELECT pt.partner_name, ', @sql, ' from partners pt
left join sales s
on pt.part_id = s.partner_id
left join products pd
on s.product_id = pd.prod_id
group by pt.partner_name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Có thể cần lưu ý rằng GROUP_CONCAT
theo mặc định được giới hạn ở 1024 byte. Bạn có thể giải quyết vấn đề này bằng cách đặt nó cao hơn trong suốt thời gian quy trình của bạn, tức là. SET @@group_concat_max_len = 32000;