2009-05-29 1 views
2

В базе данных SQL я получил информацию о хранении для каждого пользователя для каждого клиента.Сумма и расчеты для каждого клиента в хранимой процедуре SQL

Мне нужно написать хранимую процедуру, которая суммирует использование диска (МБ) для пользователей клиентов. Когда я получил полную сумму всех пользователей для одного клиента (totalDiscUsage), мне нужно выполнить расчет (простой пример):

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

После этого, мне нужно написать у в базу данных, и сделать это для всех клиентов.

Мой вопрос в том, как я могу сделать это наилучшим образом?

Возможно, используя курсор, чтобы пройти через каждого клиента, выполнить сумму и расчет и записать результат в базу данных? Будет ли это хорошим решением?

Заранее спасибо. Помощь будет очень признательна!

+1

Предполагая, что у вас ограниченное количество клиентов (т. Е. Довольно небольшое количество итераций в вашем курсоре), и вам нужно только пересчитать их с регулярными интервалами, это похоже на одобренное решение. –

ответ

4

Пожалуйста, не используйте снова курсоры! :-) SQL установлен на основе - избегайте курсоров всякий раз, когда вы можете!

И здесь вы можете - легко. Поэтому для каждого клиента сначала необходимо определить количество пользователей, а затем выполнить простой расчет и обновить клиента.

Мое предложение было бы:

  • создать маленькую функцию, которая вычисляет количество пользователей для данного клиента
  • создать вторую маленькую функцию, чтобы сделать то же самое, чтобы рассчитать общий коэффициент использования
  • диска

    написать хранимую процедуру в качестве простого обновления заявления, что делает Расчетный

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

Кажется слишком легко, почти :-)

Marc

+1

+1. Курсоры действительно дают мне эту обходную кожу, ощущение типа буги-мужчины;) –

+0

Спасибо, Марк! Это похоже на хороший способ сделать это. Я попробую. –

+1

Я согласен с тем, что курсоры следует избегать, когда это возможно, однако есть (несколько) раз, что они являются правильным решением, и в этом случае недостаточно информации, чтобы знать наверняка. Что касается двух функций, которые выполняют вычисления (предположительно с помощью выборок), я бы также поставил под вопрос эффективность этого подхода, поскольку функция будет вызвана - и рассчитана для каждого Клиента (предоставлена ​​- немного смягчена кешированием), которая на самом деле не основана на наборе решение. – Tetraneutron

0

«Лучший способ» сообщить о заданном наборе данных не может быть действительно обсужден без ссылки на то, как хранятся данные, т. Е. Соответствующие определения таблиц.

Если вы, конечно, не спрашиваете, как лучше хранить данные, чтобы разрешить эту отчетность, в этом случае вам может потребоваться изменить свой вопрос.

0

Вы могли бы сделать это с помощью курсора. Также есть шанс, что вы можете сделать это в одном заявлении с подзапросами или, возможно, предварительными вычислениями и временной таблицей, но ее трудно сказать без дополнительной информации.

+1

Избегайте курсоров - не нужно здесь, действительно.Курсоры - это кошмар. –

2

Вы можете сделать вставку с запросом на выборку для значений, таких как:

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

или что-то в этом роде. не на 100% уверен, что это сработает для вашей ситуации, так как я не совсем понимаю это из вашего вопроса.

Смежные вопросы