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

Permintaan SQL untuk membangun kembali tabel menggunakan data baris dinamis untuk nama kolom

Ini pada dasarnya adalah PIVOT tetapi MySQL tidak memiliki fungsi PIVOT. Jadi, Anda ingin mereplikasi ini menggunakan fungsi agregat dan CASE penyataan. Jika Anda mengetahui jumlah Grant nilai yang Anda miliki maka Anda dapat membuat hard-code kueri yang mirip dengan ini:

select 
  Month,
  sum(case when `grant`='DOE' then subtotal else 0 end) DOE,
  sum(case when `grant`='Hatch' then subtotal else 0 end) Hatch,
  sum(case when `grant`='NIH' then subtotal else 0 end) NIH,
  sum(case when `grant`='NSF' then subtotal else 0 end) NSF,
  sum(case when `grant`='Other' then subtotal else 0 end) Other,
  sum(case when `grant`='State' then subtotal else 0 end) State
from yourtable
group by month

Lihat SQL Fiddle dengan Demo

Sekarang, jika Anda memiliki jumlah nilai yang tidak diketahui untuk Grant , maka Anda dapat menggunakan pernyataan yang disiapkan untuk menghasilkan versi dinamis dari kueri ini:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(case when `Grant` = ''',
      `Grant`,
      ''' then Subtotal else 0 end) AS `',
      `Grant`, '`'
    )
  ) INTO @sql
FROM yourtable;


SET @sql = CONCAT('SELECT month, ', @sql, ' 
                  FROM yourtable 
                  group by month');


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

Lihat SQL Fiddle dengan Demo

Keduanya menghasilkan hasil yang sama:

|    MONTH |  HATCH |   NIH |    NSF |  OTHER |    DOE |  STATE |
-----------------------------------------------------------------
| Nov-2012 | 144.56 | 240.9 |  100.7 | 276.67 |      0 |      0 |
| Oct-2012 | 321.54 |     0 | 234.53 | 312.35 | 214.35 |      0 |
| Sep-2012 | 147.99 |     0 | 156.89 | 245.67 |      0 | 148.66 |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Membersihkan nilai array sebelum memasukkan mysql

  2. Pilih baris terakhir di MySQL

  3. Mengotomatiskan pemuatan massal data dari s3 ke instans Aurora MySQL RDS

  4. Perlu untuk menanyakan kombinasi yang berbeda dari dua bidang, bersama dengan hitungan bahwa kombinasi yang berbeda terjadi

  5. Mengambil data dari RDS memberikan AttributeError:objek 'sqlalchemy.cimmutabledict.immutabledict' tidak memiliki atribut 'setdefault'