2009-05-29 270 views
2

在SQL数据库中,我为每个客户获得了每个用户的存储信息。SQL存储过程中每个客户的总和和计算

我需要编写一个存储过程,为客户用户总结光盘使用率(MB)。当我得到了所有用户的总和为单一客户(totalDiscUsage),我需要进行计算(简单的例子):

x = numberOfUsers * 200 
y = (totalDiscUsage - x)/(10 * 5) 

在那之后,我需要到y写入数据库,并做到这一点为所有客户。

我的问题是我该如何做到这一点最好的方式?

也许使用游标浏览每个客户,执行总和和计算,并将结果写入数据库?这是一个很好的解决方案吗?

在此先感谢。帮助将非常感谢!

+1

假设您的客户数量有限(即游标中的迭代次数非常少),并且您只需要定期重新计算,这听起来像是一个好的解决方案。 – 2009-05-29 13:54:13

回答

4

请不要再次使用游标! :-) SQL是基于集合的 - 尽可能避免游标!

在这里你可以 - 很容易。因此,对于每个客户,您首先需要确定用户数量,然后进行简单计算,然后更新客户。

我的建议是:

  • 创建一个小功能,用于计算用户的数量给定客户
  • 创建第二小功能做同样的计算总的磁盘使用情况
  • 编写存储过程作为不计算

     
    CREATE PROCEDURE dbo.UpdateCustomers() 
    AS BEGIN 
        UPDATE Customers 
        SET y = (dbo.GetTotalDiskUsage(CustomerID) - dbo.GetTotalUsers(CustomerID) * 200)/50 
    END 
    
一个简单的更新语句

似乎太容易了,几乎:-)

马克

+1

+1。光标确实给我那爬行的皮肤,布吉式人的感觉;) – 2009-05-29 13:58:54

0

如果不参考数据存储方式(即相关的表格定义),就不能真正讨论报告给定数据集的“最佳方式”。

除非当然你问的是如何最好地存储数据以允许这个报告,在这种情况下,你可能需要改写你的问题。

0

你肯定会用光标做到这一点。还有一个机会,你可以在一个语句中使用子查询或可能的预先计算和临时表来做到这一点,但没有更多的信息很难说。

+1

避免游标 - 这里不需要,真的。游标是性能噩梦。 – 2009-05-29 13:58:04

2

你可以将插入件与该值,如选择查询:

INSERT INTO DiskUsage 
SELECT SUM(Users.Usage) FROM Customers INNER JOIN Users ON somefield and somefield 

或类似的东西。不是100%确定这是否适用于您的情况,因为我不清楚您的问题。