用sum子句按日期排序

时间:2014-10-03 10:44:10

标签: mysql sql

我有这张桌子:

-----------------------------------------------------------
|  id  |  name  |        date       |  count  |  balance  |
-----------------------------------------------------------
    1       a        0000-00-00          1          10
    2       b        2014-10-02          1          20
    3       c        2014-09-01          1          30
    4       d        2014-09-16          1          40

我需要获得四个SUMcount中的balanceSELECT上的date列,然后按0000-00-00按升序排序,但我需要确保它不应该是SELECT date, SUM(count) AS deposit_counts, SUM(balance) AS balance_sum FROM tbl ORDER BY date ASC 。我尝试了这种语法,但它没有按照我想要的方式命令日期。

-------------------------------------------
|        date       |  count  |  balance  |
-------------------------------------------
     2014-09-01          4          90

我的预期输出:

{{1}}

2 个答案:

答案 0 :(得分:1)

使用MIN和NULLIF函数:

SELECT 
  MIN(NULLIF(date, '0000-00-00')) AS min_date,
  SUM(count) AS deposit_counts, 
  SUM(balance) AS balance_sum
FROM tbl

在此测试:http://sqlfiddle.com/#!2/d43acf/1

答案 1 :(得分:0)

我希望我理解有一个日期而不是有空的点,所以只有一种可能性需要排除......无论如何,首先我会假设你可能想得到每天的总余额并且需要沿着这些行进行查询

SELECT
    date,
    sum(count) AS deposit_counts,
    SUM(balance) AS balance_sum
FROM tbl
WHERE date <> '0000-00-00'
GROUP BY date
ORDER BY date

将输出

2014-09-01          1          30
2014-09-16          1          40
2014-10-02          1          20

但是现在看起来你没有,我不是百分之百确定你的未来查询的最终目标是什么,所以我猜你想要一个截至当前日期的余额的历史值,统治淘汰奇怪的零日期事物。在这种情况下,您可能需要一个大于WHERE的子句,并且可能只是日期列中的最低值,以显示此日期的总数,如下所示:

SELECT
    min(date) AS date,
    sum(count) AS deposit_counts,
    SUM(balance) AS balance_sum
FROM tbl
WHERE date > '0000-00-00'

因为它会忽略它将返回的无效日期

2014-09-01          3          80

我希望这有一些用处。

编辑:

如果您绝对需要所有值,那么您将需要使用子查询来检索并排除异常日期结果,如下所示:

SELECT
    (SELECT min(date) FROM tbl WHERE date > '0000-00-00') AS date,
    sum(count) AS deposit_counts,
    SUM(balance) AS balance_sum
FROM tbl

或如上所述,您日期查询的nullif也应该起作用