22,209
社区成员
发帖
与我相关
我的任务
分享
-->连续聚合
-->测试数据:[groups]
--SELECT [groupid],[ordmonth],[val] FROM [groups]
DECLARE @result TABLE ([groupid] VARCHAR(1),[ordmonth] DATETIME,[val] INT,[runval] INT)
DECLARE @groupid VARCHAR(1),@prvgroupid VARCHAR(1),@ordmonth DATETIME,@val INT,@runval INT
DECLARE c CURSOR FAST_FORWARD
FOR
SELECT [groupid],[ordmonth],[val] FROM [groups] ORDER BY [groupid],[ordmonth]
OPEN c
FETCH NEXT FROM c INTO @groupid,@ordmonth,@val
SELECT @prvgroupid=@groupid,@runval=0
WHILE @@fetch_status = 0
BEGIN
IF @groupid<>@prvgroupid
BEGIN
SELECT @prvgroupid=@groupid,@runval=0
END
SET @runval=@runval+@val
INSERT INTO @result VALUES(@prvgroupid,@ordmonth,@val,@runval)
FETCH NEXT FROM c INTO @groupid,@ordmonth,@val
END
CLOSE c
DEALLOCATE c
SELECT [groupid],[ordmonth],[val],[runval]FROM @result ORDER BY [groupid],[ordmonth]
-->分组的聚合乘积
--> 测试数据:[groups]
IF OBJECT_ID('[groups]') IS NOT NULL DROP TABLE [groups]
GO
CREATE TABLE [groups]([groupid] VARCHAR(1),ordmonth DATETIME,[val] INT)
INSERT [groups]
SELECT 'a','2012-01-01',3 UNION ALL
SELECT 'a','2012-02-01',1 UNION ALL
SELECT 'a','2012-03-01',8 UNION ALL
SELECT 'a','2012-04-01',10 UNION ALL
SELECT 'a','2012-05-01',15 UNION ALL
SELECT 'b','2012-01-01',1 UNION ALL
SELECT 'b','2012-02-01',2 UNION ALL
SELECT 'b','2012-03-01',3 UNION ALL
SELECT 'b','2012-04-01',20 UNION ALL
SELECT 'b','2012-05-01',10 UNION ALL
SELECT 'c','2012-01-01',10 UNION ALL
SELECT 'c','2012-02-01',12 UNION ALL
SELECT 'c','2012-03-01',13 UNION ALL
SELECT 'c','2012-04-01',14 UNION ALL
SELECT 'c','2012-04-01',3 UNION ALL
SELECT 'c','2012-05-01',20
GO
--> 测试语句:
DECLARE @result TABLE ([groupid] VARCHAR(1),[product] BIGINT)
DECLARE @groupid VARCHAR(1),@val INT,@prvgroupid VARCHAR(1),@product BIGINT
DECLARE c CURSOR FAST_FORWARD
FOR
SELECT [groupid],[val] FROM [groups] ORDER BY [groupid]
OPEN c
FETCH NEXT FROM c INTO @groupid, @val
SELECT @prvgroupid=@groupid,@product=1
WHILE @@fetch_status = 0
BEGIN
IF @groupid<>@prvgroupid
BEGIN
INSERT INTO @result VALUES(@prvgroupid,@product)
SELECT @prvgroupid=@groupid,@product=1
END
SET @product=@product*@val
FETCH NEXT FROM c INTO @groupid, @val
END
IF @prvgroupid IS NOT NULL
INSERT INTO @result VALUES(@prvgroupid,@product)
CLOSE c
DEALLOCATE c
SELECT [groupid],[product] FROM @result
--方法二
--这个方法看似很简洁,语法精炼,但是如果,在数据中出现
SELECT [groupid],EXP(SUM(LOG([val]))) FROM [groups]
GROUP BY [groupid]