2016-12-04 26 views
2

我想請教以下問題查找列的最大總和在SQL Server中的任何3行

我有很多行的表和以下幾列

sender, recipient, value 

例如

sender recipient value 
smith williams  500 
smith taylor  100 
smith vagelis  200 
vagelis taylor  150 
giorgos taylor  150 
nikos taylor  200 
smith Kostas  300 

我想找到任何3行和所有特定發件人的最大值總和。

在我的例子

smith 800 
giorgos 150 
vagelis 150 
nikos 200 

最後發現所有的發送者,他們對任何3行最大總和高於500.This是我的最終目標。

在我的例子

smith 800 

預先感謝您

更新 我發現@Prdp的幫助下,解決方案發布

select distinct a.sender,a.total_sum from(
SELECT t1.sender,(t1.value+ t2.value + t3.value) 
     as total_sum 
    FROM  
    transfers2 t1, transfers2 t2, transfers2 t3 
      where 
       t1.sender = t2.sender 
      and t3.sender = t2.sender 
      and t1.date!=t2.date 
      and t1.date!=t3.date 
      and t2.date!=t3.date 
      ) a 
      where a.total_sum>500 
+3

編輯你的問題併發布一些樣品數據/預期結果 –

回答

3

另一種方法(效率不高)。戈爾丹的做法是比這

SELECT Distinct sender 
FROM (SELECT t1.sender, 
       CASE cnt 
       WHEN 1 THEN t1.value 
       WHEN 2 THEN t1.value + t2.value 
       ELSE t1.value + t2.value + t3.value 
       END total_sum 
     FROM (SELECT sender,value,Count(1) OVER(partition BY sender) AS cnt FROM yourtable) t1 
       JOIN yourtable t2 
       ON t1.sender = t2.sender 
       JOIN yourtable t3 
       ON t3.sender = t2.sender) a 
Where total_sum > 500 

更好您可以通過添加一個Where條款

更新過濾發件人:基礎上編輯,你只需要簡單的Group byHaving條款

Select sender,sum(value) 
From yourtable 
Group by sender 
Having sum(value) > 500 
+0

按'total_sum'而不是'row_number'排序。另外,你需要某種'id'來保證同一行不被使用三次。 –

+0

@GordonLinoff - 使用'Row_number'剛剛開始OP想要爲多個'sender'完成相同的操作。更新處理相同的行在計數小於三時不被使用三次/兩次 –

+0

謝謝您的回答! 我收到一條錯誤消息,但無法運行查詢 列名'total_sum'無效。 – vagelis

3

我解釋了一個問題,您希望表中任意三行的最大總和。如果您選擇三行並希望達到最大值,只需選擇具有非負值的行。

的最大總和將與最大的三個值的行,如果你想最大化的總和:

select sum(value) 
from (select top 3 t.* 
     from t 
     order by value desc 
    ) t; 

您可能還需要添加where value >= 0如果大多數值是負的,「3」是指「最多3「。

如果您希望特定發件人的最大數量,然後將where sender = @sender添加到子查詢中。

+0

謝謝你好! 如果我想對特定的收件人或發件人進行相同的計算,我該怎麼做? – vagelis

+0

Sory,我沒有說得很好我已經編輯了我的第一篇文章 如果您不介意,請您再檢查一次嗎? – vagelis

0

這將給發件人姓名誰做了三筆交易> 500

SELECT sender 
FROM transfers t 
GROUP BY sender 
HAVING (select sum(value) from (select top 3 transfers.* from transfers 
      where sender = t.sender order by value desc) t1 ) >=500