4

植物のレコードがたくさんあるテーブルがあります。植物には、表にさまざまなレコードとして示されているいくつかの名前を付けることができます。テーブルはnew_plantsnameと呼ばれます

plantid name
1       tree
1       rose
2       bush
3       tree
3       bush
3       rose

これは3000以上のレコードで継続します

私が欲しいのは、同じplantidを持つレコードを組み合わせて、異なる列に異なる名前を表示することです。

plantid name1 name2 name3 ...
1       tree  rose  NULL
2       shrub NULL  NULL
3       tree  rose  bush 

また、結果を新しいテーブルに保存したい

4

1 に答える 1

4

これは基本的にPIVOT(RDBMSを指定していません)MySQLを想定しており、関数がないため、ステートメントPIVOTを含む集計関数を使用してこれを複製する必要があります。CASEこのソリューションはrownumber各行にを追加するため、name列に変換する必要のある値の数を決定できます。

取得する値の数がわかっている場合nameは、値をハードコーディングできます。

select plantid,
  max(case when nameRn = 'name1' then name end) Name1,
  max(case when nameRn = 'name2' then name end) Name2,
  max(case when nameRn = 'name3' then name end) Name3
from
(
  select plantid, name,
      concat('name', @num := if(@plantid = `plantid`, @num + 1, 1)) as nameRn,
      @plantid := `plantid` as dummy
  from
  (
    select plantid, name, @rn:=@rn+1 overall_row_num
    from yourtable, (SELECT @rn:=0) r
  ) x
  order by plantid, overall_row_num
) src
group by plantid;

SQL FiddlewithDemoを参照してください

値の数が不明な場合は、プリペアドステートメントを使用して、次の動的バージョンを生成できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when nameRn = ''',
      nameRn,
      ''' then name end) AS ',
      nameRn
    )
  ) INTO @sql
FROM 
(
  select plantid, name,
      concat('name', @num := if(@plantid = `plantid`, @num + 1, 1)) as nameRn,
      @plantid := `plantid` as dummy
  from
  (
    select plantid, name, @rn:=@rn+1 overall_row_num
    from yourtable, (SELECT @rn:=0) r
  ) x
  order by plantid, overall_row_num
) src;


SET @sql = CONCAT('SELECT plantid, ', @sql, ' 
                  FROM 
                  (
                    select plantid, name,
                        concat(''name'', @num := if(@plantid = `plantid`, @num + 1, 1)) as nameRn,
                        @plantid := `plantid` as dummy
                    from
                    (
                      select plantid, name, @rn:=@rn+1 overall_row_num
                      from yourtable, (SELECT @rn:=0) r
                    ) x
                    order by plantid, overall_row_num
                  ) src
                   GROUP BY plantid');

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

SQL FiddlewithDemoを参照してください

どちらも同じ結果を生成します。

| PLANTID | NAME1 |  NAME2 |  NAME3 |
-------------------------------------
|       1 |  tree |   rose | (null) |
|       2 |  bush | (null) | (null) |
|       3 |  tree |   bush |   rose |
于 2012-11-15T18:04:57.483 に答える