如何在mysql中根据2个日期选择记录
我有一张桌子要汇款如何在mysql中根据2个日期选择记录,mysql,sql,date,group-by,where-clause,Mysql,Sql,Date,Group By,Where Clause,我有一张桌子要汇款 |RemitNo|id|emp|emp_loc| emp_cat |ap_from| ap_to |amount| | 1 |1 | a | PAL | PRIVATE |12/2015|12/2015| 50.00| | 2 |1 | a | PAL | PRIVATE |01/2016|01/2016|100.00| | 3 |1 | a | PAL | PRIVATE |02/2016|02/2016|100.00| |
|RemitNo|id|emp|emp_loc| emp_cat |ap_from| ap_to |amount|
| 1 |1 | a | PAL | PRIVATE |12/2015|12/2015| 50.00|
| 2 |1 | a | PAL | PRIVATE |01/2016|01/2016|100.00|
| 3 |1 | a | PAL | PRIVATE |02/2016|02/2016|100.00|
| 4 |2 | b | BTG |GOVERNMENT|01/2016|01/2016|200.00|
| 5 |2 | b | BTG |GOVERNMENT|02/2016|02/2016|200.00|
| 6 |3 | c | MAR | PRIVATE |12/2015|12/2015| 50.00|
| 7 |3 | c | MAR | PRIVATE |01/2016|01/2016|100.00|
| 8 |3 | c | MAR | PRIVATE |02/2016|02/2016|100.00|
我需要在下面创建一个视图AP2015,并选择2015年及以下以及emp_cat为私有且由emp_loc分组的所有汇款的总额/总额
我需要这张桌子
|emp_loc| emp_cat |amount|
| PAL | PRIVATE | 50.00|
| MAR | PRIVATE | 50.00|
我使用了此报表,但2016年的汇款仍然存在
SELECT Emp_loc, Emp_Cat, FORMAT(SUM(Amount),2) As Amount
FROM tbl_remit
WHERE AP_from <= '01/01/2015' AND AP_To <= '01/01/2015' AND Emp_Cat = 'PRIVATE'
GROUP BY Emp_Loc
选择Emp\u loc,Emp\u Cat,格式(总和(金额),2)作为金额
从tbl_汇款
正如@Giorgos所指出的,AP_from,您似乎使用文本类型而不是日期类型来存储日期。永远不要这样做。但是,由于您有,您可以在进行比较时使用STR_TO_DATE
将文本转换为日期
您遇到的另一个问题是,您在groupby
查询中选择了非聚合列
SELECT Emp_loc, Emp_Cat, FORMAT(MIN(Amount),2) As Amount
FROM tbl_remit
WHERE STR_TO_DATE(AP_from, '%m/%Y') <= '2015-01-01' AND
STR_TO_DATE(AP_to, '%m/%Y') <= '2015-01-01' AND
Emp_Cat = 'PRIVATE'
GROUP BY Emp_Loc, Emp_Cat
选择Emp\u loc、Emp\u Cat、格式(最小(金额)、2)作为金额
从tbl_汇款
正如@Giorgos所指出的,STR_TO_DATE(AP_from,'%m/%Y'),您似乎是在使用文本类型而不是日期类型存储日期。永远不要这样做。但是,由于您有,您可以在进行比较时使用STR_TO_DATE
将文本转换为日期
您遇到的另一个问题是,您在groupby
查询中选择了非聚合列
SELECT Emp_loc, Emp_Cat, FORMAT(MIN(Amount),2) As Amount
FROM tbl_remit
WHERE STR_TO_DATE(AP_from, '%m/%Y') <= '2015-01-01' AND
STR_TO_DATE(AP_to, '%m/%Y') <= '2015-01-01' AND
Emp_Cat = 'PRIVATE'
GROUP BY Emp_Loc, Emp_Cat
选择Emp\u loc、Emp\u Cat、格式(最小(金额)、2)作为金额
从tbl_汇款
其中STR_TO_DATE(AP_from,'%m/%Y')AP_from和AP_TO是日期类型?
那就试试这个
SELECT Emp_loc, Emp_Cat, FORMAT(SUM(Amount),2) As Amount
FROM tbl_remit
WHERE YEAR(AP_from) = 2015 AND YEAR(AP_To) = 2015 AND Emp_Cat = 'PRIVATE'
GROUP BY Emp_Loc
ap\U from和ap\U to是日期类型?
那就试试这个
SELECT Emp_loc, Emp_Cat, FORMAT(SUM(Amount),2) As Amount
FROM tbl_remit
WHERE YEAR(AP_from) = 2015 AND YEAR(AP_To) = 2015 AND Emp_Cat = 'PRIVATE'
GROUP BY Emp_Loc
您应该使用Date
数据类型来存储日期。金额50.00
显示在预期结果集中的逻辑是什么?我有72000条雇主汇款记录。我们需要知道在2015年之后的适用期限内,所有私人公司支付了多少汇款。这只是一个例子。我是否应该为示例添加更多记录?您的ap_from和ap_to列的类型是什么?我认为这些不是日期,因为12/2015
在您的结果中不是日期格式。数据类型是VARCHAR您应该使用date
数据类型来存储日期。金额50.00
在预期结果集中出现的逻辑是什么?我有72000条雇主汇款记录。我们需要知道在2015年之后的适用期限内,所有私人公司支付了多少汇款。这只是一个例子。我是否应该为示例添加更多记录?您的ap_from和ap_to列的类型是什么?我认为这些不是日期,因为在您的结果中,12/2015
不是日期格式。数据类型是varchar似乎是ap\u from和ap\u to不是日期类型是的。我会先清理我的记录并使用它。似乎ap_from和ap_to不是日期类型是的,它不是。我会先清理我的记录,然后用这个。是的,我用过。对不起,我会先清理我的记录。但是谢谢你,先生:)先生,Emp_Loc,Emp_Cat分组背后的原因是什么?如果你想选择Emp_Cat
,它必须出现在GROUP BY
子句中,或者必须在聚合函数中。我选择前者是因为这似乎最有意义。是的,我选择了。对不起,我会先清理我的记录。但是谢谢你,先生:)先生,Emp_Loc,Emp_Cat分组背后的原因是什么?如果你想选择Emp_Cat
,它必须出现在GROUP BY
子句中,或者必须在聚合函数中。我选择前者是因为这似乎最有意义。