求计算月日均的SQL语句,并结果保存到除此而外表中
求计算月日均的SQL语句,并结果保存到另外表中
账号 存取日期 发生额 余额
A 2015-10-6 100000 100000
A 2015-10-15 -50000 50000
B 2015-10-3 20000 20000
B 2015-10-21 40000 60000
A 2015-11-6 180000 230000
A 2015-11-15 -100000 130000
B 2015-11-3 20000 80000
B 2015-11-22 40000 120000
想要的结果并保存到temp_ck表中
账号 日均 月日均
A 2015-10 56451.61
B 2015-10 ....
A 2015-11 146666.67
B 2015-11 ....
计算公式:
A账号10月份日均为=(6号-1号)*余额(0)+(15号-6号)*余额(100000)+(31号-15号+1)*余额(50000)/31=56451.61
A账号11月份日均为=(6号-1号)*余额(50000)+(15号-6号)*余额(230000)+(30号-15号+1)*余额(130000)/30=146666.67
------解决思路----------------------
SQL 2005 或以上版本适用。
PS: 你不是已经有过类似的发帖么。。。
http://bbs.****.net/topics/391846027
跟这帖应该差不多吧。
账号 存取日期 发生额 余额
A 2015-10-6 100000 100000
A 2015-10-15 -50000 50000
B 2015-10-3 20000 20000
B 2015-10-21 40000 60000
A 2015-11-6 180000 230000
A 2015-11-15 -100000 130000
B 2015-11-3 20000 80000
B 2015-11-22 40000 120000
想要的结果并保存到temp_ck表中
账号 日均 月日均
A 2015-10 56451.61
B 2015-10 ....
A 2015-11 146666.67
B 2015-11 ....
计算公式:
A账号10月份日均为=(6号-1号)*余额(0)+(15号-6号)*余额(100000)+(31号-15号+1)*余额(50000)/31=56451.61
A账号11月份日均为=(6号-1号)*余额(50000)+(15号-6号)*余额(230000)+(30号-15号+1)*余额(130000)/30=146666.67
------解决思路----------------------
SQL 2005 或以上版本适用。
;WITH table1(账号, 存取日期, 发生额, 余额) as
(
select 'A','2015-10-06',100000.00, 100000.00 union all
select 'A','2015-10-15',-50000.00, 50000.00 union all
select 'B','2015-10-03',20000.00, 20000.00 union all
select 'B','2015-10-21',40000.00, 60000.00 union all
select 'A','2015-11-06',180000.00, 230000.00 union all
select 'A','2015-11-15',-100000.00,130000.00 union all
select 'B','2015-11-03',20000.00, 80000.00 union all
select 'B','2015-11-22',40000.00, 120000.00
)
, b AS (
SELECT DISTINCT 账号
FROM table1
)
,c AS ( -- 日历
SELECT convert(nvarchar(10),DateAdd(day,number,'2015-10-01'), 120) 日期
FROM master..spt_values
WHERE type = 'p'
AND number < 61
)
,d AS (
SELECT b.账号,
c.日期
FROM b
JOIN c
ON 1=1
)
,e AS
(
select d.账号, d.日期, isnull(f.余额, 0) as 余额 from d
OUTER APPLY (
SELECT TOP 1 *
FROM table1 t
WHERE t.账号 = d.账号
AND t.存取日期 <= d.日期
ORDER BY t.存取日期 DESC
) f
)
SELECT
账号, MONTH(日期) 月份,
convert(decimal(18,2),AVG(余额)) as 日均余额
FROM e
GROUP BY MONTH(日期), 账号
PS: 你不是已经有过类似的发帖么。。。
http://bbs.****.net/topics/391846027
跟这帖应该差不多吧。