-2

私の場合、次のようなテーブルがあるとしましょう:

id  group_id    text        data    empty1  empty2  empty3  empty4  empty5

1   20      AB      data1
2   20      AB      data2
3   21      AC      data3
4   20      AB      data4
5   21      AC      data5
6   22      AD      data6
7   22      AD      data7
8   22      AD      data8
9   23      AF      data9

ご覧のとおり、フィールド「group_id」によると、フィールド「テキスト」には同じデータが含まれています。「text」が英数字で「group_id」が数値であるという唯一の違い。フィールド 'data' にはさまざまなテキスト情報が含まれています (varchar (255))

次のように、group_idに従って、MySQL内のテーブルを処理して「データ」フィールドから「空の」フィールドに値をコピー(または移動)することは可能ですか?

id  group_id    text        data        empty1      empty2      empty3  empty4  empty5

1   20      AB      data1       data1       data2       data4
2   20      AB      data2
3   21      AC      data3       data3       data5
4   20      AB      data4
5   21      AC      data5
6   22      AD      data6       data6       data7       data8
7   22      AD      data7
8   22      AD      data8
9   23      AF      data9       data9

最初にすべてを埋める方が簡単かもしれません-つまり

id  group_id    text        data        empty1      empty2      empty3  empty4  empty5

1   20      AB      data1       data1       data2       data4
2   20      AB      data2       data1       data2       data4

そして最後のステップとして - group_id に基づいて重複を削除するだけで、最終的に次のような明確な FINAL テーブルが得られます

id  group_id    text        data        empty1      empty2      empty3  empty4  empty5

1   20      AB      data1       data1       data2       data4
3   21      AC      data3       data3       data5
6   22      AD      data6       data6       data7       data8
9   23      AF      data9       data9
4

1 に答える 1

7

変数と集計関数を使用してデータの行を列に転置することにより、データを必要な形式に変換できます。

必要な形式でデータを取得するための基本的な構文は次のとおりです。

select d.id,
  d.group_id,
  d.text,
  t.data,
  d.empty1,
  d.empty2,
  d.empty3,
  d.empty4,
  d.empty5
from yourtable t
inner join 
(
  select min(id) id,
    group_id,
    text,
    max(case when row=1 then data end) empty1,
    max(case when row=2 then data end) empty2,
    max(case when row=3 then data end) empty3,
    max(case when row=4 then data end) empty4,
    max(case when row=5 then data end) empty5
  from
  (
    select id, 
      group_id,
      text,
      data,
      @row:=case 
              when @pg=group_id and @pt=text
              then @row
              else 0 end +1 row,
      @pg:=group_id,
      @pt:=text
    from yourtable 
    cross join
    (
      select @row:=0, @pg:=0, @pt:=null
    ) c
    order by group_id, text, id
  ) src
  group by group_id, text
  order by group_id, text, id
) d
  on t.id = d.id

SQL Fiddle with Demoを参照してください。このクエリの結果は次のとおりです。

| ID | GROUP_ID | TEXT |  DATA | EMPTY1 | EMPTY2 | EMPTY3 | EMPTY4 | EMPTY5 |
-----------------------------------------------------------------------------
|  1 |       20 |   AB | data1 |  data1 |  data2 |  data4 | (null) | (null) |
|  3 |       21 |   AC | data3 |  data3 |  data5 | (null) | (null) | (null) |
|  6 |       22 |   AD | data6 |  data6 |  data7 |  data8 | (null) | (null) |
|  9 |       23 |   AF | data9 |  data9 | (null) | (null) | (null) | (null) |
于 2013-08-01T14:15:21.907 に答える