次のようなテーブルがあります。
+----------------------------------------+
|Name | kode | jum |
+----------------------------------------+
| aman |kode1 | 2 |
| aman |kode2 | 1 |
| jhon |kode1 | 4 |
| amir |kode2 | 4 |
+--------------------+-----------+-------+
MySQLでこのようなビューを作成するにはどうすればよいですか?
kode1 kode2 count
aman 2 1 3
jhon 0 4 4
amir 0 4 4
これは「ピボット」の形式です。その検索語を使用して他のオプションを見つける必要があります。
あなたはこのようなものを試すことができます:
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;
(サンプルビューにjhon
のエラーがあると想定)
例:
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)
列数がわかっている場合は、他の回答と同様の静的バージョンを使用できます。しかし、不明な番号がある場合は、次のように 準備されたステートメント を使用できます。
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;
結果は同じです:
| NAME | KODE1 | KODE2 | COUNT |
--------------------------------
| aman | 2 | 1 | 3 |
| amir | 0 | 4 | 4 |
| jhon | 4 | 0 | 4 |
行を列に変換するには、CASE
ステートメントを使用する必要があります。個々のkode
の数を取得するには、次のようなSUM
関数を使用する必要があります。
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