2011-09-28 47 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