我想从我的数据库中获取过去31天的一些数据。当列“finalized”为空时,我想从列“today”中获取数据,但如果列“finalized”不为空,我想从列“finalized”中获取数据。我总是想得到最后一行。
表MyEarnings
id INT(11) AI
date datetime
today decimal(4,2) NULL
finalized decimal(4,2) NULL
id date today finalized
-----------------------------------------------
6 2016-02-04 04:52:00 0.39 NULL
5 2016-02-03 12:34:00 NULL 19.74
4 2016-02-03 12:33:00 15.96 NULL
3 2016-02-03 12:32:00 12.32 NULL
2 2016-02-02 15:16:00 NULL 9.16
1 2016-02-02 14:29:00 2.20 NULL
SQL语言
SELECT
date,
CASE
WHEN finalized=NULL
THEN today
WHEN finalized!=NULL
THEN finalized
END
AS earn
FROM MyEarnings
GROUP BY DATE_FORMAT(date, '%Y-%m-%d')
ORDER BY date ASC
LIMIT 0 , 31
这就是我的结局
date earn
---------------------------
2016-02-02 00:00:00 NULL
2016-02-03 00:00:00 NULL
2016-02-04 00:00:00 NULL
我想得到的
date earn
----------------------------
2016-02-02 00:00:00 9.16
2016-02-03 00:00:00 19.74
2016-02-04 00:00:00 0.39
编辑
我还想得到每个月“finalized”列中所有值的摘要,其中包含每天的最大“id”。
最佳答案
您需要条件聚合,但这有点棘手。我想这就是你想要的:
SELECT DATE_FORMAT(date, '%Y-%m-%d'),
COALESCE(MAX(finalized), MAX(today)) as earn
FROM MyEarnings
GROUP BY DATE_FORMAT(date, '%Y-%m-%d')
ORDER BY date ASC
LIMIT 0 , 31;
这将返回
today
的最大值。您可能需要最新的值。如果是这样,最简单的方法可能是GROUP_CONCAT()
/SUBSTRING_INDEX()
方法:SELECT DATE_FORMAT(date, '%Y-%m-%d'),
COALESCE(MAX(finalized),
SUBSTRING_INDEX(GROUP_CONCAT(today ORDER BY date DESC), ',', 1) + 0
) as earn
FROM MyEarnings
GROUP BY DATE_FORMAT(date, '%Y-%m-%d')
ORDER BY date ASC
LIMIT 0 , 31;
把数字转换成字符串,然后再转换回来,这样做有点不舒服。替代方法需要额外的连接或使用变量。
关于mysql - SELECT CASE出现问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35176257/