日期:2014-05-17  浏览次数:20380 次

请教一个日期统计查询
表字段就两个
金额   日期
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]
/*
month total
2013-01 200
2013-02 0
2013-03 0
2013-04 0
2013-05 0
2013-06 0
2013-07 120
2013-08 0
2013-09 0
2013-10 0
2013-11 0
2013-12 0
*/

------解决方案--------------------

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