2017-09-28 126 views
0

我有一個數據結構就像一個表:Mysql的合併多行到一個非空值

+-----------+-----------+-----------+-----------+ 
| member_id | bank_name | bank_ac | ac_holder | 
+-----------+-----------+-----------+-----------+ 
|  14 |   | 012-000 |   | 
|  14 |   | 012-001 |  Andy | 
|  14 | CR Bank | 012-002 |  Jacky | 
+-----------+-----------+-----------+-----------+ 

我需要的是選擇與第一個非空值填充所有列的一個條目。作爲:

+-----------+-----------+-----------+-----------+ 
| member_id | bank_name | bank_ac | ac_holder | 
+-----------+-----------+-----------+-----------+ 
|  14 | CR Bank | 012-000 |  Andy | 
+-----------+-----------+-----------+-----------+ 

我不知道如何開始。有人可以給我建議嗎?

ps:空字段不是NULL,它們是空字符串。 架構提供here

+0

另一個解決方法是什麼由'Andy'被保留在'Jacky'邏輯? –

+0

感謝您的幫助蒂姆,我需要有第一個非空值。因爲Andy比Jacky早出現,所以我得到Andy – user3711105

+0

我們可以假設可能還有兩個銀行名字?或者三個?我們可以假設只有'bank_name'和'ac_holder'列會有缺失值嗎? –

回答

1

如果數據中包含像'(注null是不一樣的「」)爲空值,你可以使用一些聚集

select member_id, 
min(bank_name) bank_name, 
min(bank_ac) bank_ac, 
min(ac_holder) ac_holder 
from demo 
group by member_id 

DEMO

,那麼你可以把案件條款在聚合函數跳過這些類型值

select member_id, 
min(case when bank_name is not null and bank_name <> '' then bank_name end) bank_name, 
min(case when bank_ac is not null and bank_ac <> '' then bank_ac end) bank_ac, 
min(case when ac_holder is not null and ac_holder <> '' then ac_holder end) ac_holder 
from demo 
group by member_id 

DEMO

您的問題

select member_id, 
substring_index(group_concat(case when bank_name is not null and bank_name <> '' then bank_name end order by your_auto_increment_col asc) ,',',1) bank_name, 
substring_index(group_concat(case when bank_ac is not null and bank_ac <> '' then bank_ac end order by your_auto_increment_col asc) ,',',1) bank_ac, 
substring_index(group_concat(case when ac_holder is not null and ac_holder <> '' then ac_holder end order by your_auto_increment_col asc) ,',',1) ac_holder 
from demo 
group by member_id 

DEMO

+0

感謝您的幫助,我試過了,但這樣的非空字段不爲空,但「」。 – user3711105

+0

提供您的示例數據使用http://sqlfiddle.com/ –

+0

在這裏請:http://sqlfiddle.com/#!9/8ee3cf – user3711105