【问题标题】:How can sum values from the previous month?如何对上个月的值求和?
【发布时间】:2014-10-16 17:18:21
【问题描述】:

我正在尝试汇总上个月输入的金额 (SET)

结构如下:

CREATE TABLE tester (
date_amount date,
amount int);


INSERT INTO tester VALUES
("2014-08-01", 1000),
("2014-08-02", 1001),
("2014-08-03", 1002),
("2014-08-31", 2000),
("2014-08-31", 2000),
("2014-08-31", 2000),
("2014-09-01", 1006);

这里以示例为例

如果我输入 year= 2014 和 month= 9,我应该自动总结在这种情况下输入的月份的最后一天“2014-08-31”中的所有金额

这里是demo

SET @month := 09;
SET @year := 2014;

select sum(amount) from tester 
where   month(date_amount)= @month-1

查询必须汇总上个月最后一天输入的所有金额

我必须有这样的结果:

SUM(AMOUNT)
6000

我试过这个,但不是正确的方法,因为我知道这个月的最后一天:

SET @month := 09;
SET @year := 2014;

select sum(amount) from tester 
where   month(date_amount)= @month-1 and day(date_amount)= 31

我也试过这个查询,但得到了 NULL

SET @month := 09;
SET @year := 2014;

SELECT sum(amount)FROM tester 
WHERE month(date_amount)= @month-1 AND day(date_amount) =last_day(day(date_amount))

请问有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    提供一个实际的日期,而不是只提供月份和年份,然后你就可以得到你想要的结果

    SET @month := 09;
    SET @year := 2014;
    
    SELECT sum(amount)FROM tester 
    WHERE month(date_amount)= @month-1 AND day(date_amount) = day(last_day(date_amount))
    

    或者,您可以使用 STR_TO_DATE 将给定的月份和年份首先转换为日期并使用它而不是 @Date

    【讨论】:

    • 很高兴能帮上忙! :D
    • @ThanatosSama 我刚刚注意到你几乎得到了正确的答案。如果您将 where 子句的第二个条件更改为 day(last_day(date_amount)),那么在您获得 null 的第二次尝试中也可以。你得到 null 的原因是因为 last_day 返回的日期不等于 day 返回的日期(整数)。
    • 哦,对不起,我没有注意到你写了@日期,我不想只输入月份和年份的日期。
    • @ThanatosSama 正如我在评论中解释的那样,我已更改答案以反映这些更改,现在您无需输入日期。现在应该是一个可以接受的答案;)
    【解决方案2】:

    类似这样的:

    SELECT SUM(AMOUNT) FROM Tester
    WHERE date_amount = LAST_DAY(STR_TO_DATE(@Month + '/00/' + @Year, '%m/%d/%Y'))
    

    如果对表中的部分行使用函数,则会强制 sql 进行表扫描。如果将数据转换为完整的字段,则可以在搜索中使用索引。

    【讨论】:

    • 您已经接近答案,但我发现如果翻译非法将返回 NULL,但感谢您的帮助。
    【解决方案3】:

    这可能会有所帮助:

    SET @month := 09;
    SET @year := 2014;
    
    SELECT sum(amount) FROM tester 
    WHERE month(date_amount)= @month-1 and date_amount = last_Day(date_amount)
    

    【讨论】:

      【解决方案4】:

      如上所述,最好在不先应用函数的情况下比较列

      SET @month = '09', @year = '2014';
      
      SELECT
          SUM(amount) total
      FROM
          tester
      WHERE
          date_amount = STR_TO_DATE(CONCAT_WS('-', @year, @month, '01'), '%Y-%m-%d') - INTERVAL 1 DAY  
      

      【讨论】:

        【解决方案5】:

        不要使用月份的第一天和最后一天,而是使用带有 TO_CHAR(YYYYMM) 的年份和月份

        select sum(amount)
         from tester 
        group  by to_char(date_amount, 'YYYYMM');
        

        在 Mysql 中你可以使用 DATE_FORMAT(date_amount, '%Y%m') 代替 to_char

        【讨论】:

        • 查询必须汇总上个月最后一天输入的所有金额
        猜你喜欢
        • 1970-01-01
        • 2016-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多