2014-11-06 49 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循环。

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