SQL存储过程中每个客户的总和和计算

时间:2009-05-29 13:49:20

标签: sql stored-procedures

在SQL数据库中,我获得了每个用户的存储信息。

我需要编写一个存储过程,为客户用户汇总磁盘使用量(MB)。当我得到单个客户的所有用户总数(totalDiscUsage)时,我需要执行一个计算(简单示例):

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

之后,我需要将y写入数据库,并为所有客户执行此操作。

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

可能使用游标遍历每个客户,执行求和和计算,并将结果写入数据库?这会是一个很好的解决方案吗?

提前致谢。非常感谢帮助!

4 个答案:

答案 0 :(得分:4)

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

在这里你可以 - 轻松。因此,对于每个客户,您需要先确定用户数,然后进行简单的计算,并更新客户。

我的建议是:

  • 创建一个计算给定客户的用户数的小功能
  • 创建第二个小功能来执行相同的操作来计算总磁盘使用量
  • 将存储过程编写为执行计算的简单更新语句

    CREATE PROCEDURE dbo.UpdateCustomers()
    AS BEGIN
        UPDATE Customers
        SET y = (dbo.GetTotalDiskUsage(CustomerID) - dbo.GetTotalUsers(CustomerID) * 200) / 50
    END 
    

似乎太容易了,差不多: - )

马克

答案 1 :(得分:2)

您可以使用选择查询执行插入,例如:

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

或类似的东西。并非100%确定这是否适合您的情况,因为我对您的问题并不十分清楚。

答案 2 :(得分:0)

如果没有参考数据的存储方式,即相关的表定义,就无法真正谈论报告给定数据集的“最佳方式”。

除非您当然询问如何最好地存储数据以允许此报告,在这种情况下您可能需要重新提问。

答案 3 :(得分:0)

你肯定能用光标做到这一点。您也可以在一个带有子查询或可能的预计算和临时表的语句中执行此操作,但在没有更多信息的情况下很难判断。