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

tanggal tabel pivot mysql (data vertikal ke horizontal)

Untuk mendapatkan hasil ini, Anda ingin memutar data. MySQL tidak memiliki fungsi pivot tetapi Anda dapat menggunakan fungsi agregat dengan CASE ekspresi.

Jika jumlah tanggal diketahui, Anda dapat membuat hard-code kueri:

select client_id,
  max(case when rownum = 1 then date end) Date1,
  max(case when rownum = 2 then date end) Date2,
  max(case when rownum = 3 then date end) Date3
from
(
  select client_id,
    date,
    @row:=if(@prev=client_id, @row,0) + 1 as rownum,
    @prev:=client_id 
  from yourtable, (SELECT @row:=0, @prev:=null) r
  order by client_id, date
) s
group by client_id
order by client_id, date

Lihat SQL Fiddle dengan Demo

Saya menerapkan variabel pengguna untuk menetapkan nomor baris ke setiap catatan dalam client_id grup.

Jika Anda memiliki jumlah tanggal yang tidak diketahui, maka Anda perlu menggunakan pernyataan yang disiapkan untuk membuat sql secara dinamis:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN rownum = ',
      rownum,
      ' THEN date END) AS Date_',
      rownum
    )
  ) INTO @sql
from
(
  select client_id,
    date,
    @row:=if(@prev=client_id, @row,0) + 1 as rownum,
    @prev:=client_id 
  from yourtable, (SELECT @row:=0) r
  order by client_id, date
) s
order by client_id, date;


SET @sql 
  = CONCAT('SELECT client_id, ', @sql, ' 
           from
           (
             select client_id,
               date,
               @row:=if(@prev=client_id, @row,0) + 1 as rownum,
               @prev:=client_id 
             from yourtable, (SELECT @row:=0) r
             order by client_id, date
           ) s
           group by client_id
           order by client_id, date');

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

Lihat SQL Fiddle dengan Demo .

Keduanya memberikan hasil:

| CLIENT_ID |                          DATE_1 |                          DATE_2 |                     DATE_3 |
--------------------------------------------------------------------------------------------------------------
|         1 | February, 03 2013 00:00:00+0000 | February, 10 2013 00:00:00+0000 | May, 12 2013 00:00:00+0000 |
|         2 | February, 03 2013 00:00:00+0000 |     July, 15 2013 00:00:00+0000 |                     (null) |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tabel SQL dengan entri daftar vs tabel SQL dengan baris untuk setiap entri

  2. MySQL CHAR() vs T-SQL CHAR():Apa Bedanya?

  3. MYSQL PHP Peringatan:mysql_query() mengharapkan parameter 1 menjadi string

  4. MySQL COALESCE () Dijelaskan

  5. Permintaan tabel pivot MySQL dengan kolom dinamis