590
社区成员
发帖
与我相关
我的任务
分享
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
CREATE TABLE #T([date] datetime,userid NVARCHAR(100),amount INT)
Insert #T
select '2011/10/1 1:00',N'u1',20 union all
select '2011/10/1 2:00',N'u1',52 union all
select '2011/10/1 3:00',N'u2',14 union all
select '2011/10/1 3:00',N'u4',58 union all
select '2011/10/1 3:00',N'u5',75 union all
select '2011/10/1 4:00',N'u1',84 union all
select '2011/10/1 4:00',N'u2',12 union all
select '2011/10/1 4:00',N'u5',32 union all
select '2011/10/2 4:00',N'u4',56 union all
select '2011/10/2 4:00',N'u2',95 union all
select '2011/10/2 4:00',N'u5',47 union all
select '2011/10/3 5:00',N'u5',58 union all
select '2011/10/3 4:00',N'u6',69 union all
select '2011/10/3 4:00',N'u2',78 union all
select '2011/11/1 4:00',N'u5',52 union all
select '2011/11/2 4:00',N'u6',66 union all
select '2011/11/3 4:00',N'u4',69 union all
select '2011/11/4 4:00',N'u5',90 union all
select '2011/12/1 4:00',N'u6',30 union all
select '2011/12/1 4:00',N'u4',41 union all
select '2011/12/1 4:00',N'u7',80 union all
select '2011/12/1 4:00',N'u8',95 union all
select '2011/12/1 4:00',N'u5',41
Go
--测试数据结束
;
WITH tempa
AS ( SELECT YEAR(date) AS nian ,
MONTH(date) AS yue ,
userid ,
SUM(amount) AS amount
FROM #T
GROUP BY YEAR(date) ,
MONTH(date) ,
userid
),
tempb
AS ( SELECT * ,
ROW_NUMBER() OVER ( ORDER BY nian, yue ) AS num
FROM tempa
),
tempc
AS ( SELECT nian ,
yue ,
userid ,
amount ,
( SELECT SUM(amount)
FROM tempb b
WHERE b.num <= a.num
) AS 累计
FROM tempb a
)
SELECT nian ,
yue ,
a.userid ,
a.amount ,
a.累计 ,
RTRIM(CONVERT(DECIMAL(10, 2), ( ( CONVERT(FLOAT, a.amount) )
/ ( SELECT SUM(b.amount)
FROM tempc b
WHERE b.nian = a.nian
AND b.yue = a.yue
) ) * 100)) + '%' AS 同比当月金额
FROM tempc a;
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
CREATE TABLE #T([date] datetime,userid NVARCHAR(100),amount INT)
Insert #T
select '2011/10/1 1:00',N'u1',20 union all
select '2011/10/1 2:00',N'u1',52 union all
select '2011/10/1 3:00',N'u2',14 union all
select '2011/10/1 3:00',N'u4',58 union all
select '2011/10/1 3:00',N'u5',75 union all
select '2011/10/1 4:00',N'u1',84 union all
select '2011/10/1 4:00',N'u2',12 union all
select '2011/10/1 4:00',N'u5',32 union all
select '2011/10/2 4:00',N'u4',56 union all
select '2011/10/2 4:00',N'u2',95 union all
select '2011/10/2 4:00',N'u5',47 union all
select '2011/10/3 5:00',N'u5',58 union all
select '2011/10/3 4:00',N'u6',69 union all
select '2011/10/3 4:00',N'u2',78 union all
select '2011/11/1 4:00',N'u5',52 union all
select '2011/11/2 4:00',N'u6',66 union all
select '2011/11/3 4:00',N'u4',69 union all
select '2011/11/4 4:00',N'u5',90 union all
select '2011/12/1 4:00',N'u6',30 union all
select '2011/12/1 4:00',N'u4',41 union all
select '2011/12/1 4:00',N'u7',80 union all
select '2011/12/1 4:00',N'u8',95 union all
select '2011/12/1 4:00',N'u5',41
Go
--测试数据结束
;WITH tempa AS (
SELECT CONVERT(NVARCHAR(100), date, 23) AS date ,
userid ,
SUM(amount) AS amount
FROM #T
GROUP BY CONVERT(NVARCHAR(100), date, 23) ,
userid
),tempb AS (
SELECT *,ROW_NUMBER()OVER(ORDER BY date) AS num FROM tempa
),tempc AS(
SELECT date ,
userid ,
amount ,
( SELECT SUM(amount)
FROM tempb b
WHERE b.num <= a.num
) AS 累计
FROM tempb a )
SELECT a.date ,
a.userid ,
a.amount ,
a.累计 ,
RTRIM(CONVERT(DECIMAL(10, 2), ( ( CONVERT(FLOAT, a.amount) )
/ ( SELECT SUM(b.amount)
FROM tempc b
WHERE b.date = a.date
) ) * 100)) + '%'
FROM tempc a;
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
CREATE TABLE #T([date] datetime,userid NVARCHAR(100),amount INT)
Insert #T
select '2011/10/1 1:00',N'u1',20 union all
select '2011/10/1 2:00',N'u1',52 union all
select '2011/10/1 3:00',N'u2',14 union all
select '2011/10/1 3:00',N'u4',58 union all
select '2011/10/2 4:00',N'u1',47 union all
select '2011/10/2 4:00',N'u2',95 union all
select '2011/10/2 4:00',N'u4',56 union all
select '2011/10/3 5:00',N'u1',58 union all
select '2011/10/3 4:00',N'u2',69
Go
--测试数据结束
;WITH tempa AS (
SELECT CONVERT(NVARCHAR(100), date, 23) AS date ,
userid ,
SUM(amount) AS amount
FROM #T
GROUP BY CONVERT(NVARCHAR(100), date, 23) ,
userid
),tempb AS (
SELECT *,ROW_NUMBER()OVER(ORDER BY date) AS num FROM tempa
)
SELECT date ,
userid ,
amount ,
( SELECT SUM(amount)
FROM tempb b
WHERE b.num <= a.num
) AS 累计
FROM tempb a