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

Query Dinamis di MySQL

Untuk mendapatkan hasil yang Anda inginkan, Anda harus membatalkan putaran data saat ini dari kolom menjadi baris, lalu putar year data dari baris menjadi kolom.

MySQL tidak memiliki fungsi PIVOT atau UNPIVOT, jadi Anda perlu menggunakan UNION ALL query untuk unpivot dan fungsi agregat dengan CASE ekspresi ke pivot.

Jika Anda memiliki jumlah nilai yang diketahui, Anda dapat membuat hard-code nilai yang mirip dengan ini:

select locid,
  event,
  max(case when year = 2011 then value end) `2011`,
  max(case when year = 2012 then value end) `2012`
from
(
  select LocId, Year, 'Birth' event, Birth value
  from yt
  union all
  select LocId, Year, 'Death' event, Death value
  from yt
  union all
  select LocId, Year, 'Abc' event, Abc value
  from yt
) d
group by locid, event;

Lihat SQL Fiddle dengan Demo .

Tetapi jika Anda akan memiliki jumlah nilai yang tidak diketahui, maka Anda perlu menggunakan pernyataan yang disiapkan untuk menghasilkan SQL dinamis. Kodenya akan mirip dengan berikut ini:

SET @sql = NULL;
SET @sqlUnpiv = NULL;
SET @sqlPiv = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'select locid, year, ''',
      c.column_name,
      ''' as event, ',
      c.column_name,
      ' as value 
      from yt '
    ) SEPARATOR ' UNION ALL '
  ) INTO @sqlUnpiv
FROM information_schema.columns c
where c.table_name = 'yt'
  and c.column_name not in ('LocId', 'Year')
order by c.ordinal_position;

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(CASE WHEN year = ',
      year,
      ' THEN value else null END) AS `',
      year, '`'
    )
  ) INTO @sqlPiv
FROM yt;

SET @sql 
  = CONCAT('SELECT locid,
              event, ', @sqlPiv, ' 
            from 
            ( ',  @sqlUnpiv, ' ) d
            group by locid, event');

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

Lihat SQL Fiddle dengan Demo . Hasil dari kedua query tersebut adalah:

| LOCID | EVENT | 2011 | 2012 |
-------------------------------
|     1 |   Abc |   10 |   20 |
|     1 | Birth |  100 |   98 |
|     1 | Death |   60 |   70 |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kesalahan sintaks dengan IF EXISTS UPDATE ELSE INSERT

  2. Tampilkan gambar BLOB Laravel 4

  3. MySQL String Indeks Terakhir Dari

  4. Bidang peningkatan database mysql menggunakan sintaks record aktif codeigniter

  5. Apakah perlu menulis ROLLBACK jika kueri gagal?