2014-02-21 37 views
0

我有一個表的數據是這樣的:列值的SQL集團通過一筆不固定值

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 

這工作得很好,除了在結果集中的羣體,一個是超過£1000:

GroupID NumRows TotalGiftAid 
1 100 999.83 
2 107 999.57 
3 91 990.82 
4 114 1009.34 
5 114 995.40 
6 58 455.65 

我不明白這是爲什麼。任何人都可以解釋並幫助我解決它嗎?或者建議更好的方法altogther?

+0

也許我錯過了一些東西,但是您的示例數據不會累加到接近1,000的任何東西上;) – gvee

+0

不,總共有584行,我認爲這不是一個好主意商場。是否有一個設施可以共享更大量的樣本數據? – cjashwell

+0

這是我的一些數學方面的失敗,以最高限額(running_sum/1000)作爲GroupID部分。我想也許我需要除以1001或其他東西。 – cjashwell

回答

1

可以使用一個變量獲得單表更新運行值,並調理變量重置時,在此基礎上運行值超過1000還可以更新一個組ID 。這是我會怎麼做的。我在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 
+0

這是完美的。我已經針對我的數據運行了它,它完全符合我的要求。另外,它運行時間不到一秒鐘,而我的查詢需要大約2分鐘。謝謝。 – cjashwell

+0

非常歡迎您先生! :) –

0

試試這個:

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

謝謝,但這只是消除了第4組,即超過1K的團隊,運行總和在3k到4k之間的團隊。我仍然需要輸出我所有的行,只是「擠壓」成1k或更少的組。 – cjashwell

+0

好的,從問題不清楚,我重新閱讀它... – Sparky