2014-11-06 59 views
0

說我有一個表,是這樣的如何組合行同時省略空值?

ID | FieldA | FieldB | FieldC | GroupID 
--------------------------------------- 
1 |  50 | NULL|  80 |  1 
2 | NULL |  60 | NULL |  1 
3 |  70 | NULL|  50 |  1 

我想製作一個單行顯示的遞減順序(由ID)非NULL值 所以生成的表是這樣的

ID | FieldA | FieldB | FieldC | GroupID 
--------------------------------------- 
3 |  70 |  60|  50 |  1 

有沒有辦法在MySQL中做到這一點? 我想:

SELECT * 
FROM (table) 
GROUP BY GroupID 
ORDER BY ID DESC 

,但沒有運氣

(當然)這裏有一個小提琴,這樣可以起到瓦特/這個快!

http://sqlfiddle.com/#!2/71846f/2

謝謝!

+0

如果我得到你的權利,你想從每列選擇哪個不比你以前的列中選擇的值越大,最大的價值? – 2014-11-06 08:48:45

+0

嘿安德烈亞斯,價值的大小是無關緊要的。儘管最大的ID很重要。 – m0dE 2014-11-06 08:57:16

+0

所以,換言之,我需要來自最高ID(在我的示例表中爲3)的值,但因爲它的FieldB爲NULL,它將借用下一個最高ID 2的值,並將FieldB設置爲60 – m0dE 2014-11-06 08:58:16

回答

1

也許這也不是沒有可能爲每列子查詢:

SELECT 
(SELECT `ID` FROM `table1` ORDER BY `ID` DESC LIMIT 1) AS `ID`, 
(SELECT `FieldA` FROM `table1` WHERE `FieldA` IS NOT NULL ORDER BY `ID` DESC LIMIT 1) AS `FieldA`, 
(SELECT `FieldB` FROM `table1` WHERE `FieldB` IS NOT NULL ORDER BY `ID` DESC LIMIT 1) AS `FieldB`, 
(SELECT `FieldC` FROM `table1` WHERE `FieldC` IS NOT NULL ORDER BY `ID` DESC LIMIT 1) AS `FieldC`, 
(SELECT `GroupID` FROM `table1` WHERE `GroupID` IS NOT NULL ORDER BY `ID` DESC LIMIT 1) AS `GroupID` 
+0

Hi Uril ,這產生了期望的結果(http://sqlfiddle.com/#!2/bccf27/1)。但是,是否有更簡單的解決方案呢?在我的實際表格中,我有20列,我關心的是性能:/ – m0dE 2014-11-06 09:03:17

0

你應該空檢查你的領域象下面這樣:僅組ID

SELECT * 
FROM table 
WHERE FieldA is not null 
AND FieldB is not null 
AND FieldC is not null 
ORDER BY ID DESC 
+0

OP的樣本表的結果是什麼? – 2014-11-06 08:48:09

+0

無。但看到他的輸出,其中字段非空。 – SMA 2014-11-06 08:49:26

+0

http://sqlfiddle.com/#!2/71846f/1不起作用 – m0dE 2014-11-06 08:55:24

0
select MAX(feA), 
     MAX(feB), 
     MAX(feC) 
from test05 
0

組,然後選擇所有coulmns的最大值。 。 這將有助於

SELECT max(id),max(FIELDA),max(FIELDB),max(FIELDC),GroupID 
FROM (table) 
GROUP BY GroupID 
+0

這會導致答案成爲:70, 60,80.這不是我想要的 – m0dE 2014-11-06 09:01:09

0

正如你想的最小值值FIELDC這有你只是想這樣。 此查詢未測試 請回復,如果任何錯誤來此查詢

SELECT max(id),max(FIELDA),max(FIELDB),min(FIELDC),GroupID 
FROM (test) 
GROUP BY GroupID 
+0

@mode請檢查我已粘貼的答案 – 2014-11-06 09:26:28

+0

@Fred請檢查小提琴演示http://sqlfiddle.com/#!2/71846f/21 – 2014-11-06 09:30:19

+0

這與現有的答案和OP已經表示,這不會給出所需的結果 – Fred 2014-11-06 09:30:44

0

你可以用列名1-20創建CTE(複製到它的原始數據)

,那麼你將選擇每列(max(列))並將其更新到臨時表中。

(將原始表格複製到temp並截斷它)。

使用column_number和動態sql循環。

我希望你明白我的意思 - :)