MySQL tabel tunggal pivot statis dan dinamis

8

Saya memiliki tabel yang terlihat seperti ini:

+----------------------------------------+
|Name                | kode      | jum   |
+----------------------------------------+
| aman               |kode1      | 2     |
| aman               |kode2      | 1     |
| jhon               |kode1      | 4     |
| amir               |kode2      | 4     |
+--------------------+-----------+-------+

Bagaimana saya bisa membuat tampilan seperti ini dengan MySQL?

                    kode1    kode2     count
aman                  2         1        3  
jhon                  0         4        4
amir                  0         4        4
Khairu Aqsara
sumber

Jawaban:

7

Ini adalah bentuk "pivot", Anda harus menggunakan istilah pencarian itu untuk menemukan opsi lain.

Anda dapat mencoba sesuatu seperti ini:

select
     name
   , sum(case when kode = 'kode1' then jum else 0 end) as 'kode1'
   , sum(case when kode = 'kode2' then jum else 0 end) as 'kode2'
   , sum(jum) as count
from foo
group by name;

(dengan asumsi tampilan contoh Anda memiliki kesalahan untuk jhon)

Contoh:

mysql> select * from foo;
+------+-------+------+
| name | kode  | jum  |
+------+-------+------+
| aman | kode1 |    2 |
| aman | kode2 |    1 |
| jhon | kode1 |    4 |
| amir | kode2 |    4 |
+------+-------+------+
4 rows in set (0.00 sec)


mysql> select
    ->      name
    ->    , sum(case when kode = 'kode1' then jum else 0 end) as 'kode1'
    ->    , sum(case when kode = 'kode2' then jum else 0 end) as 'kode2'
    ->    , sum(jum) as count
    -> from foo
    -> group by name;
+------+-------+-------+-------+
| name | kode1 | kode2 | count |
+------+-------+-------+-------+
| aman |     2 |     1 |     3 |
| amir |     0 |     4 |     4 |
| jhon |     4 |     0 |     4 |
+------+-------+-------+-------+
3 rows in set (0.00 sec)
Tikar
sumber
11

Jika Anda memiliki jumlah kolom yang diketahui, maka Anda dapat menggunakan versi statis yang mirip dengan jawaban lainnya. Tetapi jika Anda memiliki nomor yang tidak dikenal maka Anda dapat menggunakan pernyataan yang disiapkan mirip dengan ini:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when kode = ''',
      kode,
      ''' then jum else 0 end) AS ',
      kode
    )
  ) INTO @sql
FROM yourtable;


SET @sql = CONCAT('SELECT name, ', @sql, ', sum(jum) as `count`
                  FROM yourtable 
                  GROUP BY name');

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

Lihat SQL Fiddle dengan demo

Hasilnya sama:

| NAME | KODE1 | KODE2 | COUNT |
--------------------------------
| aman |     2 |     1 |     3 |
| amir |     0 |     4 |     4 |
| jhon |     4 |     0 |     4 |
Taryn
sumber
8

Untuk mengonversi baris ke kolom, Anda perlu menggunakan CASEpernyataan. Dan untuk mendapatkan hitungan untuk individu kodeAnda perlu menggunakan SUMfungsi seperti ini:

SELECT NAME,
       SUM(CASE kode WHEN 'kode1' THEN jum ELSE 0 END) AS kode1
      ,SUM(CASE kode WHEN 'kode2' THEN jum ELSE 0 END) AS kode2
      ,SUM(jum) AS `Count`
FROM Table1
GROUP BY Name

Lihat SQLFiddle ini

hims056
sumber