我有下表:
oDate value
------------------------
2017-01-01 10
2017-01-10 10
2017-02-04 20
2017-03-01 10
2017-03-06 30
2017-04-10 40
我希望按月计算所有日期的总数。所以查询应该是:
select datepart(month, oDate) month, SUM(value) TotalValue
from myTable
group by datepart(month, oDate)
如果我想获得所有值的总和,我只需要跳过group by
部分并移除datepart(month, oDate)
。
我有2个参数@Month int
和@Year varchar(5)
问题是:我想在选定的month
和year
中添加一些计算。
例如,如果@Month <= 3
和@Year <= '2017'
的参数则总计为(Jan/2017 TotalValue) + (Feb/2017 TotalValue) + (Mar/2017 TotalValue)
。
但是,如果@Month > 3
和@Year = '2017'
的参数则总计为(Jan/2017 TotalValue) + (Feb/2017 TotalValue) + (Mar/2017 TotalValue) + (Apr/2017 TotalValue * 2)
。
样本结果:
第一个标准(@Month&lt; = 3和@Year&lt; ='2017')
TotalValue
------------
70
有第二个标准(@Month&gt; 3和@Year&gt; ='2017')
TotalValue
-----------
150
在第二个标准中,2017年4月的总数是2
的倍数。所以40 * 2 = 80
。 2017年1月至2017年3月的总价值为70
,然后第二个标准的年度为70 + 80 = 150
。
有办法吗?
请告知,干杯。
答案 0 :(得分:2)
对于这个简单的示例,以下是您将如何做到这一点。另外,根据您的测试数据,您的价值是错误的。 1月 - 3月的总数是80,而不是70。
declare @table table (oDate date, [value] int)
insert into @table
values
('20170101',10),
('20170110',10),
('20170204',20),
('20170301',10),
('20170306',30),
('20170410',40)
declare @Month int = 4 --change this to 3, or 2, or 1...
declare @Year int = 2017
select
--[Month] = datepart(month, oDate),
TotalValue = SUM(case when datepart(month, oDate) <= 3 then [value] else [value] * 2 end)
from
@table
where
datepart(year,oDate) = @Year
and datepart(month, oDate) <= @Month
--group by
-- datepart(month, oDate)