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

MySQL hoặc PHP Chuyển đổi hàng thành cột

Nếu bạn cũng muốn có các cột riêng biệt cho các năm của mình, bạn phải thêm năm (được tính từ cột date của bạn ) vào mã sql động của bạn:

CREATE DEFINER=`root`@`localhost` PROCEDURE `test`()
BEGIN
  SET group_concat_max_len=2048;
  SET @sql = NULL;

  SELECT GROUP_CONCAT(DISTINCT CONCAT(
      'MAX(IF(month = ''',
      month,
      ''' and year(date) = ',
      year(date),
      ', amount, NULL)) AS `',
      month,
      '_',
      year(date),
      '`'
    )
    order by date
  ) INTO @sql
  FROM tmp_results;

  if coalesce(@sql,'') != '' then
    set @sql = concat(', ', @sql);
  end if; 

  SET @sql = CONCAT(
    'SELECT r.account, 
     r.region ',  
     coalesce(@sql,''),
    ' FROM tmp_results r
     LEFT JOIN accounts AS a
     on r.account_id = a.id
     GROUP BY r.account, r.region');

  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END

Các cột sẽ được đặt tên như January_2017 và tôi đã thêm một order by date , nếu không thì chúng thường không có thứ tự.

Tôi đã thêm một nhóm group by r.region , nếu không, nó sẽ không hoạt động nếu only_full_group_by được bật trên máy chủ của bạn (là giá trị mặc định bắt đầu với MySQL 5.7).

Và tôi đã thêm một bài kiểm tra cho các bảng trống (nếu không sẽ dẫn đến lỗi). Nếu bạn không cần nó và chỉ sao chép các phần mã của tôi vào mã của bạn, hãy lưu ý đến dấu phẩy bị thiếu sau r.region trong SET @sql = CONCAT('SELECT r.account, r.region ' so với mã của bạn, bạn có thể phải thêm lại.

Vì mã cho mỗi tháng có độ dài khoảng 80, bạn có thể phải tăng group_concat_max_len để phù hợp với truy vấn lớn nhất có thể của bạn.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL:Phương thức CHỌN - nhưng không hiển thị bản sao / GROUP hoặc DISTINCT?

  2. Mẹo nhanh về MySQL:Sử dụng hàm DAYOFWEEK

  3. Cập nhật MySQL mất (quá) lâu

  4. Chèn các giá trị float / decimal PHP vào MySQL

  5. Trả về một biến sql cho PHP