2011-09-28 59 views
4

假設我有一個表:ACCOUNT
它列:IDNAMEBALANCESQL服務器 - 在查詢中選擇邏輯結果

我想,以確定是否人結餘的總和誰擁有平衡不止2,000美元大於50,000美元。這意味着我想選擇一個邏輯值。因爲我不想得到具體的數字,所以我只需要比較結果。我希望能夠寫出如下內容:

SELECT SUM(BALANCE) > 50000 
    FROM ACCOUNT 
WHERE BALANCE > 2000 

Sql Server說這是語法錯誤。所以,我必須做的:

SELECT SUM(BALANCE) 
    FROM ACCOUNT 
WHERE BALANCE > 2000 

那麼結果比較50000 但是考慮所有項目的總和達到50000之後是多餘的,因爲我只把它比作50000

那麼怎麼可以以達到比較值後停止的方式寫這個查詢並給我邏輯結果?

回答

1

這樣做並沒有真正的乾淨方式,只要達到總數,SQL Server就會使掃描短路。

您可以使用遞歸CTE來代替餘額。這種退出條件可能是一旦總額超過50,000美元。根據表基數和索引,這可能或多或少有效。

你也可以有一個自定義的CLR聚合,如果達到了50,000就會拋出一個錯誤而終止處理,但是相當可怕的解決方案!

1

看看HAVING關鍵字。

SELECT sum(balance) 
FROM account 
WHERE balance > 2000 
HAVING sum(balance) > 50000 

編輯:可能沒有快捷方式,如原來的問題問。它可能可能如果SQL Server查詢引擎意識到where/having子句可以是快捷方式(正如Martin Smith在評論中所說)。我認爲寫你自己的捷徑 - 呃會過於複雜,如果你遇到性能問題,那麼可能會有更好的方法。

如果你需要通過查詢得到一個真/假的答案,那麼Jim Dagg的回答對我來說很好。

+2

你已經錯過了,我認爲這個問題的地步。 –

+0

@MartinSmith我正要發佈相同的東西。 – JNK

+0

是的,我正在重讀這個問題,並且以爲我錯過了整個問題。現在正在處理一個想法.... – OCary

2

你不知道。

SQL Server如何知道你只有正面價值?如果你有10個值,第8個值超過50,000,但9和10都是-10,000,那不是問題嗎?

+0

那些被超過2000個條件排除 –

+0

@MartinSmith - 邏輯上它們是,但是根據索引它們可能不會在運行SUM之前被過濾掉。 – JNK

+0

哪裏餘額> 2000提供。 –

0

我不會去試圖寫一個複雜的過程來短路查詢的路線。 - 這是過度的工程問題。說實話,只要拿出總和並按照你現在所做的方式進行比較就是最直接的方法。 如果您想選擇其它SQL處理使用比較的結果,你可以試試這個:

SELECT CASE WHEN 
    (SELECT SUM(AmtCurrent) 
    FROM [SisMaster].[dbo].[Loan] 
    WHERE AmtCurrent > 2000) > 50000 
THEN 1 
ELSE 0 
END 
1

,除非你創建一個光標的程序你不能停止查詢,這將停止抓取到達50000後(不知道這是否是沃辛,但它是唯一的辦法,也許你有幾百萬行):

DECLARE @bal int 
DECLARE @bal_tot int 
DECLARE cur CURSOR FOR 
SELECT sum(balance) 
FROM account 
WHERE balance > 2000 
ORDER BY balance DESC; 

OPEN cur; 

FETCH NEXT FROM cur 
INTO @bal 
WHILE @@FETCH_STATUS = 0 AND @bal_tot < 50000 
BEGIN 
@bal_tot = @bal_tot + @bal 
END 
CLOSE cur; 

if @bal_tot > 50000 etc... 
0
SELECT CASE WHEN TotalAmtCurrent > 50000 THEN 1 ELSE 0 END 
FROM 
    (SELECT SUM(AmtCurrent) as TotalAmtCurrent  
    FROM [SisMaster].[dbo].[Loan]  
    WHERE AmtCurrent > 2000) a