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

请教非自然月的统计
有个表,假设只有三个字段:ID(自动增长)、日期、金额。

现在要分年统计每年1-12月的金额总数,但是月份不是按自然月来计算,而是上月的26日至本月的25日为一个计费月。比如说8月份为7月26日至8月的25日。这里还涉及到了跨年度的问题,比如说2012年1月份的统计范围实际上是2011年12月26日至2012年1月25日。

现在要生成如下报表,请问应该怎样写这个存储过程?谢谢!


------解决方案--------------------
SQL code
 
--试下,应没错
select datepart(year,dateadd(day,-25,日期)),
sum(case when datepart(month,dateadd(day,-25,日期))=1 then 金额 else 0 end) [1月],
sum(case when datepart(month,dateadd(day,-25,日期))=2 then 金额 else 0 end) [2月],
sum(case when datepart(month,dateadd(day,-25,日期))=3 then 金额 else 0 end) [3月],
sum(case when datepart(month,dateadd(day,-25,日期))=4 then 金额 else 0 end) [4月],
sum(case when datepart(month,dateadd(day,-25,日期))=5 then 金额 else 0 end) [5月],
sum(case when datepart(month,dateadd(day,-25,日期))=6 then 金额 else 0 end) [6月],
sum(case when datepart(month,dateadd(day,-25,日期))=7 then 金额 else 0 end) [7月],
sum(case when datepart(month,dateadd(day,-25,日期))=8 then 金额 else 0 end) [8月],
sum(case when datepart(month,dateadd(day,-25,日期))=9 then 金额 else 0 end) [9月],
sum(case when datepart(month,dateadd(day,-25,日期))=10 then 金额 else 0 end) [10月],
sum(case when datepart(month,dateadd(day,-25,日期))=11 then 金额 else 0 end) [11月],
sum(case when datepart(month,dateadd(day,-25,日期))=12 then 金额 else 0 end) [12月]
from 你的表
where datepart(year,dateadd(day,-25,日期)) between 2008 and 2012
group by datepart(year,dateadd(day,-25,日期))

------解决方案--------------------
SQL code
 
select year(日期) AS 年,
sum(case when MONTH(日期+7)=1 then 1 ELSE 0 END) as [1月],
sum(case when convert(VARCHAR(5),日期,10) between '01-25' and '02-26'then 金额 else 0 end) as [2月],
sum(case when convert(VARCHAR(5),日期,10) between '02-25' and '03-26'then 金额 else 0 end) as [3月],
sum(case when convert(VARCHAR(5),日期,10) between '03-25' and '04-26'then 金额 else 0 end) as [4月],
sum(case when convert(VARCHAR(5),日期,10) between '04-25' and '05-26'then 金额 else 0 end) as [5月],
sum(case when convert(VARCHAR(5),日期,10) between '05-25' and '06-26'then 金额 else 0 end) AS [6月],
sum(case when convert(VARCHAR(5),日期,10) between '06-25' and '07-26'then 金额 else 0 end) as [7月],
sum(case when convert(VARCHAR(5),日期,10) between '07-25' and '08-26'then 金额 else 0 end) as [8月],
sum(case when convert(VARCHAR(5),日期,10) between '08-25' and '09-26'then 金额 else 0 end) as [9月],
sum(case when convert(VARCHAR(5),日期,10) between '09-25' and '10-26'then 金额 else 0 end) as [10月],
sum(case when convert(VARCHAR(5),日期,10) between '10-25' and '11-26'then 金额 else 0 end) as [11月],
sum(case when convert(VARCHAR(5),日期,10) between '11-25' and '12-26'then 金额 else 0 end) as [12月]

FROM [tb]
GROUP BY  year(日期)

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

select 
年份
,ISNULL(CAST([1] as varchar(50)),'') [1月]
,ISNULL(CAST([2] as varchar(50)),'') [2月]
,ISNULL(CAST([3] as varchar(50)),'') [3月]
,ISNULL(CAST([4] as varchar(50)),'') [4月]
,ISNULL(CAST([5] as varchar(50)),'') [5月]
,ISNULL(CAST([6] as varchar(50)),'') [6月]
,ISNULL(CAST([7] as varchar(50)),'') [7月]
,ISNULL(CAST([8] as varchar(50)),'') [8月]
,ISNULL(CAST([9] as varchar(50)),'') [9月]
,ISNULL(CAST([10] as varchar(50)),'') [10月]
,ISNULL(CAST([11] as varchar(50)),'') [11月]
,ISNULL(CAST([12] as varchar(50)),'') [12月]
from 
(
select 年份,[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]
from
(
select
case