Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL atau PHP Ubah baris menjadi kolom

Jika Anda ingin memiliki kolom terpisah untuk tahun Anda juga, Anda harus menambahkan tahun (dihitung dari kolom Anda date ) ke kode sql dinamis Anda:

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

Kolom akan diberi nama seperti January_2017 , dan saya menambahkan order by date , jika tidak, mereka biasanya tidak berurutan.

Saya menambahkan group by r.region , jika tidak maka tidak akan berfungsi jika only_full_group_by diaktifkan di server Anda (yang merupakan nilai default yang dimulai dengan MySQL 5.7).

Dan saya menambahkan tes untuk tabel kosong (yang jika tidak akan menghasilkan kesalahan). Jika Anda tidak membutuhkannya dan hanya menyalin sebagian kode saya ke kode Anda, perhatikan koma yang hilang setelah r.region di SET @sql = CONCAT('SELECT r.account, r.region ' dibandingkan dengan kode Anda, Anda mungkin harus menambahkannya lagi.

Karena kode untuk setiap bulan memiliki panjang sekitar 80, Anda mungkin harus menambah group_concat_max_len agar sesuai dengan kueri terbesar Anda.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menyimpan JSON dalam database vs. memiliki kolom baru untuk setiap kunci

  2. Tidak dapat terhubung ke database mysql dengan play-slick 1.0.1/slick 3.0 :kesalahan konfigurasi

  3. pemicu mysql pemicu tersimpan sudah digunakan oleh pernyataan yang memanggil pemicu tersimpan

  4. Permintaan SQL untuk menghitung pengguna terdaftar per hari

  5. Saya bingung tentang koneksi MySQL bersamaan