请教一个日期统计查询
表字段就两个
金额 日期
200 2013-01-02
120 2013-07-08
……
需要按每月的26号到下一个月的25号作为一个月份期间去合计金额,还要按年份。需要注意,比如:2012-12-28要算成2013年的一月份。
[解决办法]
select CONVERT(varchar(7),日期,120) as 年月,SUM(金额) as 金额
from (
select case when day(日期)>25 then DATEADD(day,6,日期) else 日期 end as 日期,金额
from tb)t
group by CONVERT(varchar(7),日期,120)
if OBJECT_ID('tempdb..#temp', 'u') is not null drop table #temp;
go
create table #temp( [金额] int, [日期] datetime);
insert #temp
select '200','2013-01-02' union all
select '120','2013-07-08'
--假如你要统计2013年:
DECLARE @year CHAR(4)
SET @year = '2013'
--select * from #temp
;WITH CTE AS
(
SELECT [month]=@year + '-'+RIGHT('0'+RTRIM(number+1), 2) FROM master..spt_values WHERE type='p' AND number < 12
)
SELECT a.[month], total=ISNULL(SUM(b.金额),0)
FROM CTE a
LEFT JOIN #temp b
ON b.日期 >= DATEADD(month, -1, a.[month]+'-26')
AND b.日期 < CAST(a.[month]+'-26' AS DATETIME)--26之前,相当于<=25号的23:59:59.997
GROUP BY [month]
/*
monthtotal
2013-01200
2013-020
2013-030
2013-040
2013-050
2013-060
2013-07120
2013-080
2013-090
2013-100
2013-110
2013-120
*/
SELECT
CASE
WHEN DATEPART(day,日期)>=26 THEN CONVERT(CHAR(7),DATEADD(mm,1,日期),20)
ELSE CONVERT(CHAR(7),日期,20)
END ym,SUM(金额) 金额
FROM 表
GROUP BY
CASE
WHEN DATEPART(day,日期)>=26 THEN CONVERT(CHAR(7),DATEADD(mm,1,日期),20)
ELSE CONVERT(CHAR(7),日期,20)
END