SQL按列值之和分组不是固定值

SQL按列值之和分组不是固定值,sql,sql-server-2012,Sql,Sql Server 2012,我有这样一个数据表: CommonURN GiftAidAmount GA_Status 14013084 2.00 45 14637494 20.00 45 14637496 1.00 45 14637508 5.00 45 14637520 10.00 45 14637525 19.00 45 14637562 10.00 45 14637586 12.00 45 14637590 3.00 45 14637649 5.00 45 我想将我的行分组为总计1000英镑或更少的块,其中GA_S

我有这样一个数据表:

CommonURN GiftAidAmount GA_Status
14013084 2.00 45
14637494 20.00 45
14637496 1.00 45
14637508 5.00 45
14637520 10.00 45
14637525 19.00 45
14637562 10.00 45
14637586 12.00 45
14637590 3.00 45
14637649 5.00 45
我想将我的行分组为总计1000英镑或更少的块,其中GA_Status值等于45

到目前为止,我得到的是:

CREATE TABLE #Temp
(CommonURN int,
GiftAidAmount money,
RunningSum money,
GroupID int);

WITH cte
(commonURN,giftAidAmount,running_sum)
AS
(SELECT
c.commonURN,
c.giftAidAmount,
        (select sum(c2.giftAidAmount)
        from dbo.[Campaign_Data] as c2 
        where 
            GA_Status = 45 and
            c2.commonURN <= c.commonURN)
FROM 
    [dbo].[Campaign_Data] c
WHERE GA_Status = 45)

INSERT INTO #Temp (CommonURN,GiftAidAmount,RunningSum,GroupID)
SELECT 
    commonURN,
    giftAidAmount, 
    running_sum,
    ceiling(running_sum/1000) as GroupID
FROM 
    cte 
ORDER BY
    commonURN

SELECT
    GroupID,
    COUNT(*) NumRows,
    SUM(GiftAidAmount) TotalGiftAid
FROM
    #Temp
GROUP BY GroupID
我不明白这是为什么。谁能解释一下,帮我修一下吗?或者建议一种更好的替代方法?

试试以下方法:

SELECT
    GroupID,
    COUNT(*) NumRows,
    SUM(GiftAidAmount) TotalGiftAid
FROM
    #Temp
GROUP BY GroupID
HAVING SUM(GiftAidAmount) < 1000

您可以使用变量通过单表更新获得运行值,并在运行值超过1000时将变量设置为重置。您还可以基于此更新GroupID。我会这样做的。我在这里插入一堆随机数,从5到30。金额越大,您越有可能遇到运行值远低于1000的情况,但下一个值将运行值置于1000以上:

-- insert test data
declare @Campaign_Data table
    (
    GiftAidAmount money,
    RunningValue money,
    GroupID int
    )
while (select count(*) from @Campaign_Data) < 2000
    begin
        insert into @Campaign_Data (GiftAidAmount)
            values (round(rand()*25,2)+5)
    end

-- update Running Value and GroupID; restart when amount exceeds 1000
declare @RunningValue money,
        @GroupID int        
set @RunningValue = 0
set @GroupID = 1
update @Campaign_Data
    set 
        @GroupID = GroupID = case when @RunningValue + GiftAidAmount > 1000
                                  then @GroupID + 1
                                  else @GroupID
                             end,
        @RunningValue = RunningValue = case when @RunningValue + GiftAidAmount > 1000
                                            then GiftAidAmount
                                            else @RunningValue + GiftAidAmount
                                       end

-- return values grouped by GroupID
select
    GroupID,
    count(GroupID) NumRows,
    sum(GiftAidAmount) TotalGiftAid
from @Campaign_Data
group by
    GroupID
order by
    GroupID

谢谢,但这只是排除了第4组中的所有内容,第4组的资产超过1万英镑,而第4组的流动资金在3万英镑到4万英镑之间。我仍然需要输出我所有的行,只是将它们“扣”成1千英镑或更少的组。也许我遗漏了一些东西,但你的样本数据加起来不到1000英镑左右;不,总共有584行,我不认为把它们全部发布是个好主意。是否有一个共享大量样本数据的工具?这是某种数学上的失败,与ceilingrunning_sum/1000作为GroupID部分有关。我想也许我需要除以1001什么的。那太完美了。我用我的数据运行过,它完全符合我的要求。另外,它运行不到一秒钟,而我的查询大约需要2分钟。非常感谢。
-- insert test data
declare @Campaign_Data table
    (
    GiftAidAmount money,
    RunningValue money,
    GroupID int
    )
while (select count(*) from @Campaign_Data) < 2000
    begin
        insert into @Campaign_Data (GiftAidAmount)
            values (round(rand()*25,2)+5)
    end

-- update Running Value and GroupID; restart when amount exceeds 1000
declare @RunningValue money,
        @GroupID int        
set @RunningValue = 0
set @GroupID = 1
update @Campaign_Data
    set 
        @GroupID = GroupID = case when @RunningValue + GiftAidAmount > 1000
                                  then @GroupID + 1
                                  else @GroupID
                             end,
        @RunningValue = RunningValue = case when @RunningValue + GiftAidAmount > 1000
                                            then GiftAidAmount
                                            else @RunningValue + GiftAidAmount
                                       end

-- return values grouped by GroupID
select
    GroupID,
    count(GroupID) NumRows,
    sum(GiftAidAmount) TotalGiftAid
from @Campaign_Data
group by
    GroupID
order by
    GroupID