我想从我的数据库中获取过去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/

10-12 21:15