Сумма и расчеты для каждого клиента в хранимой процедуре SQL - PullRequest
2 голосов
/ 29 мая 2009

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

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

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

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

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

Может быть, с помощью курсора пролистать каждого клиента, выполнить расчет суммы и записать результат в базу данных? Это было бы хорошим решением?

Спасибо заранее. Помощь будет высоко ценится!

Ответы [ 4 ]

4 голосов
/ 29 мая 2009

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

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

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

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

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

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

Марк

2 голосов
/ 29 мая 2009

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

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

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

0 голосов
/ 29 мая 2009

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

0 голосов
/ 29 мая 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...