0

重複の可能性:
mysqlが複数の行を単一の行の列に変換する

私はこのようなmysqlテーブルを持っています:

id |  p |  c  |  v
1     p1   10    1
2     p1   20    2
3     p1   30    3
4     p2   40    1
5     p2   50    2
6     p2   60    3

今私はSQLを実行して次のような結果を得る必要があります:

p  |  as_c1 | as_c2 | as_c3
p1     10       20      30
p2     40       50      60

私はこのクエリを使用しましたが、それだけでは不十分です。

select 
p, 
c as as_c1,
c as as_c2,
c as as_c3
from test_tbl group by p, c

私はどこでも検索しました、これは可能ですか?ガイドが必要です。

4

2 に答える 2

2

これは基本的PIVOTに実行しようとしているものです。残念ながら、MySQL には機能がありませんPIVOT。これを静的または動的に行う方法は 2 つあります。列に変換する値がわかっている場合は、静的バージョンを使用できますが、値が不明な場合は、準備済みステートメントを使用してこれを動的に生成できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(case when v = ''',
      v,
      ''' then c end) AS as_c',
      v
    )
  ) INTO @sql
FROM table1;

SET @sql = CONCAT('SELECT p, ', @sql, ' 
                    FROM table1 
                    GROUP BY p');

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

デモで SQL Fiddle を参照してください

静的バージョンは次のようになります。

select p,
  sum(case when v=1 then c end) as_c1,
  sum(case when v=2 then c end) as_c2,
  sum(case when v=3 then c end) as_c3
from table1
group by p

デモで SQL Fiddle を参照してください

于 2012-10-17T21:20:28.630 に答える
0
SELECT p,
  ( CASE WHEN v = 1 THEN c ELSE NULL END ) AS as_c1,
  ( CASE WHEN v = 2 THEN c ELSE NULL END ) AS as_c2,
  ( CASE WHEN v = 3 THEN c ELSE NULL END ) AS as_c3
FROM `test_tbl`
GROUP BY p;

そうすべきだと思います。

于 2012-10-17T20:58:17.300 に答える