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

Tổng hợp hàng MySQL thành số cột động

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

Xem Bản trình diễn SQL

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;

Xem Bản trình diễn SQL

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;




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP / MySQL Chèn giá trị rỗng

  2. Tạo người dùng mới trong MySQL và cấp cho nó toàn quyền truy cập vào một cơ sở dữ liệu

  3. Không thể thực hiện kết nối vì máy đích đã chủ động từ chối nó (PHP / WAMP)

  4. TIMEDIFF () so với SUBTIME () trong MySQL:Sự khác biệt là gì?

  5. Làm cách nào để hợp nhất hai bảng MySQL?