2016-01-21 151 views
1

我有一个表:tblperson查询所有日期小于给定日期(年,月)

有在tblperson

id    amort_date  total_amort 
C000000004  12/30/2015  4584.00 
C000000004  01/31/2016  4584.00 
C000000004  02/28/2016  4584.00 

三列的用户必须提供一个帐单日期@bill_date

我想总结所有小于用户在月和年基础上给出的日期的总计,不管日期如何

例如

@bill_date = '1/16/2016' 

Result should: 

ID   sum_total_amort 
C000000004 9168.00 

不管我要总结的所有日期的垂头丧气地[526小于2016年1月

这是我的查询,但它只计算日期2016年1月,它不包括小于它的日期:

DECLARE @bill_date DATE 
SET @bill_date='1/20/2016' 

DECLARE @month AS INT=MONTH(@bill_date) 
DECLARE @year AS INT=YEAR(@bill_date) 

SELECT id,sum(total_amort)as'sum_total_amort' FROM webloan.dbo.amort_guide 
WHERE loan_no='C000000004' 
AND MONTH(amort_date) = @month 
AND YEAR(amort_date) = @year 

GROUP BY id 

回答

2

你会使用聚合和不平等:

select id, sum(total_amort) 
from webloan.dbo.amort_guide 
where loan_no = 'C000000004' and 
     year(amort_date) * 12 + month(amort_date) <= @year * 12 + @month 
group by id; 

另外,在SQL Server 2012+,你可以用EOMONTH()

select id, sum(total_amort) 
from webloan.dbo.amort_guide 
where loan_no = 'C000000004' and 
     amort_date <= EOMONTH(@bill_date) 
group by id; 
1

可以使用得到月初:

DATEADD(MONTH, DATEDIFF(MONTH, 0, @bill_date), 0) 

因此获得SUM(total_amort),您的查询应该是:

SELECT 
    id, 
    SUM(total_amort) AS sum_total_amort 
FROM webloan.dbo.amort_guide 
WHERE 
    loan_no='C000000004' 
    AND amort_date < DATEADD(MONTH, DATEDIFF(MONTH, 0, @bill_date) + 1, 0) 
0

你正在检查

AND MONTH(amort_date) < @month 
AND YEAR(amort_date) < @year 

因此,查询将仅返回结果,其中MONTH(amort_date)=MONTH(input_variable) AND YEAR(amort_date)=YEAR(input_variable)

尝试此 DECLARE @bill_date DATE SET @ bill_date = '1/20/2016年'

DECLARE @month AS INT=MONTH(@bill_date) 
DECLARE @year AS INT=YEAR(@bill_date) 

SELECT id,sum(total_amort)as'sum_total_amort' FROM webloan.dbo.amort_guide 
WHERE loan_no='C000000004' 
AND MONTH(amort_date) < @month 
AND YEAR(amort_date) < @year 

GROUP BY id 
相关问题