Pivot statique et dynamique de table unique MySQL


8

J'ai une table qui ressemble à ceci:

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

Comment puis-je créer une vue comme celle-ci avec MySQL?

                    kode1    kode2     count
aman                  2         1        3  
jhon                  0         4        4
amir                  0         4        4

Réponses:


7

Il s'agit d'une forme de "pivot", vous devez utiliser ce terme de recherche pour trouver d'autres options.

Vous pouvez essayer quelque chose comme ceci:

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;

(en supposant que votre exemple d'affichage comporte une erreur pour jhon)

Exemple:

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)

11

Si vous avez un nombre connu de colonnes, vous pouvez utiliser une version statique similaire à l'autre réponse. Mais si vous avez un nombre inconnu, vous pouvez utiliser une instruction préparée similaire à celle-ci:

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;

Voir SQL Fiddle avec démo

Le résultat est le même:

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

8

Pour convertir une ligne en colonne, vous devez utiliser l' CASEinstruction. Et pour compter les individus, kodevous devez utiliser une SUMfonction comme celle-ci:

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

Voir ce SQLFiddle

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.