2013-08-01 35 views
-2

比方說,在我來說,我有一個表,如:移調數據MySQL中 - 從列值的行值

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'的唯一區別是數字。 字段「數據」包含各種文本信息(varchar(255))

是否有可能以及如何處理MySQL中的表以根據'data'字段將值複製(或移動)到'empty'字段與GROUP_ID如下:

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 

回答

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) | 
+0

這個由@bluefeet創建的代碼完美的工作! 現在正在尋找一種方法來調整表格中的附加字段BETWEEN ** id **和** group_id **,如下所示: ** id **;號碼名稱 ; ** group_id **; **文字**; **數據**;標題;描述; ** empty1;空2; empty3;空4; empty5 **;級別;等級日期時間 ;所以NON-BOLD字段應該保留INTACT。 – Serge

+0

@Serge如果您遇到需要不同解決方案的其他問題,請不要在此更改要求 - 創建一個新問題。無論如何,沒有人可以閱讀你在評論中試圖展示的內容。 –

+0

@Serge是否有可能將Bluefeet提供的信息提供給您,並可能使用該信息爲您的問題提供未來答案,並使用我經常稱之爲學習的過程。 – Zane