2个字段的查询,只能用select,不简单
表A1
FDate(datetime型) FQty(decimal型,反正算加法)
第一列是几年的数据,有很多条(上十万),日期和数量都可能重复,我要求是输出每个月的25号(中间连续的),对应的数量是到前一个月25日再往前一年内的数量和。下面给具体例子
2009-12-23 。。。 5
2010-01-20 00:00:00 1
2010-01-25 。。。 2
2010-01-26 。。。。 3
这里省略多行(数量就算0吧)
2010-02-27 。。。。 4
2010-03-25 。。。。 5
2010-12-26.。。。 100
再次省略
2011-01-23 。。。。 6
2011-01-25 。。。。 7
2011-02-03 。。。。 8
2011-03-03 。。。。 9
2011-03-25 。。。。 10
2011-03-26(或者2011-04-01) 11
后面就不写啦
输出的是
date qty
2009-12-25 0
2010-01-25 5 (这里算的是2008-12-26到2009-12-25)
2010-02-25 5+1+2=3(只输出8)
2010-03-25 5+1+2+3=11(只输出11)
2010-04-25 11+4+5=20 (这里算的是2009-03-26到2010-03-25)
每个月都不能少05-25,06-25等等
2010-12-25 5+1+2+3+4+5=20 (2009-11-26到2010-11-25)
2011-01-25 1+2+3+4+5=15 (2009-12-26到2010-12-25)
2011-02-25 3+4+5+100+6+7=125 (2010-01-26到2011-01-25)
2011-03-25 4+5+100+6+7+8=130 (2010-02-26到2011-02-25)
2011-04-25 100+6+7+8+9+10=140 (2010-03-26到2011-03-25)
2011-05-25 100+6+7+8+9+10+11=151 (2010-04-26到2011-04-25)
(如果2011-03-26(或者2011-04-01)是最后一条,就写到这里就好了,实际上有3年的数据,50多万条)
sql?,server,select
[解决办法]
25号取到前一个月去了,更正一下
--滑动聚合
;WITH CET AS
(
select case when datepart(DD,dt)>25 then convert(varchar(7), DATEADD(MM,2,dt),120) + '-25'
else convert(varchar(7), DATEADD(MM,1,dt),120) + '-25' end as YM, SUM(Qty) SumQty
from #TA
group by case when datepart(DD,dt)>25 then convert(varchar(7), DATEADD(MM,2,dt),120) + '-25'
else convert(varchar(7), DATEADD(MM,1,dt),120) + '-25' end
)
SELECT O1.YM, SUM(O2.SumQty) AS totalqty
FROM CET AS O1
JOIN CET AS O2
ON O2.YM <= O1.YM and o2.YM>dateadd(month,-12,o1.YM)
GROUP BY O1.YM
ORDER BY O1.YM;
----------------结果----------------------------
/*
YM totalqty
---------- -----------
2010-01-25 5
2010-02-25 8
2010-03-25 11
2010-04-25 20
2011-02-25 125
2011-03-25 130
2011-04-25 140
2011-05-25 151
(8 行受影响)
*/