我正在尝试将上个月输入的金额(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);
这里以示例
为例如果我输入年份= 2014年和月份= 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
我也试过这个查询但是得到了
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))
请有人帮我这个吗?
答案 0 :(得分:1)
这样的事情:
SELECT SUM(AMOUNT) FROM Tester
WHERE date_amount = LAST_DAY(STR_TO_DATE(@Month + '/00/' + @Year, '%m/%d/%Y'))
如果在表的行的一部分上使用函数,则强制sql执行表扫描。如果将数据转换为完整字段,则可以在搜索中使用索引。
答案 1 :(得分: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
答案 2 :(得分:1)
这可能有所帮助:
SET @month := 09;
SET @year := 2014;
SELECT sum(amount) FROM tester
WHERE month(date_amount)= @month-1 and date_amount = last_Day(date_amount)
答案 3 :(得分:1)
如上所述,在没有首先应用函数的情况下比较列
会更好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
答案 4 :(得分:0)
而不是使用当月的第一天和最后一天,只使用带有TO_CHAR(YYYYMM)的年份和月份
select sum(amount)
from tester
group by to_char(date_amount, 'YYYYMM');
在Mysql中你可以使用DATE_FORMAT(date_amount,'%Y%m')而不是to_char