2009-07-08 129 views
1

我想在SQL服务器2005上创建一个查询,它将检查某些详细记录中某些字段的总和是否等于标题记录中的总字段。这将用于为我工作的公司创建电子支票存款。SQL Server 2005求和查询

层次结构如下所示: 存款 - >批次 - >检查

创建电子存款的文件之前,复制可能没有完全完成每个表,所以我需要检查,以确保每个记录在创建文件之前都在那里。基本上,我想从我的Deposits表中选择一个位置和ID列表,其中正确的批次数量和正确的检查次数确实存在于它们各自的表格中。

这是我想要的逻辑。

select location, d.id from closing_balance..cb_deposits as d 
left outer join closing_balance..cb_checkbatchhf as b on d.id = b.deposit_id and d.location = b.loc 
left outer join closing_balance..cb_checkdf as c on b.id = c.batch_id and b.loc = c.loc 
where sum(c.check_amt) = b.scanned_subtotal and sum(b.scanned_subtotal) = d.amount and sum(b.num_checks_scanned) = d.count 

上述不起作用,因为你不能在where子句中的聚合函数总和。我可以用编程方式轻松完成这个任务,但是如果在SQL语句中有一个聪明的方法可以快速完成此操作,那最好。

任何帮助是极大的赞赏。

谢谢!

+0

记住:WHERE - 从任何考虑因素中删除行,GROUP BY对其余行进行分组,并且HAVING删除组 – 2009-07-08 15:22:34

回答

4

您可以将您和检查having子句,where子句后:

select location, d.id 
from closing_balance..cb_deposits as d 
left outer join closing_balance..cb_checkbatchhf as b 
    on d.id = b.deposit_id and d.location = b.loc 
left outer join closing_balance..cb_checkdf as c 
    on b.id = c.batch_id and b.loc = c.loc 
group by location, d.id, b.scanned_subtotal, d.amount, d.count 
having sum(c.check_amt) = b.scanned_subtotal 
    and sum(b.scanned_subtotal) = d.amount 
    and sum(b.num_checks_scanned) = d.count 
+0

谢谢。这工作。 – Aaron 2009-07-08 15:31:19

1

您不能在WHERE子句中进行求和,但可以使用HAVING子句。例如

SELECT 
    Id 
FROM 
    Table 
GROUP BY 
    Id 
HAVING 
    SUM(Amount) = 100 
1

复制可能没有完全完成每个表!当然这是需要解决的问题,而不是围绕记录计数检查的工作。

你如何复制数据?

+0

我不同意。有38个位置将数据复制到将生成文件的中央位置。如果出现网络错误或者存在延迟问题或者导致进程的一部分未被复制并且文件被创建的任何部分,则该文件在被发送到银行用于电子存储时将失败。这不是一个解决方法...这是一个检查,以确保所有的数据实际上存在。 – Aaron 2009-07-08 15:53:27