2009-05-29 10 views
2

SQLデータベースでは、各ユーザーごとに、顧客ごとにストレージ情報を取得しました。SQLストアドプロシージャ内の各顧客の合計と計算

顧客ユーザーのディスク使用量(MB)を合計するストアドプロシージャを記述する必要があります。私は単一の顧客のために、すべてのユーザー(totalDiscUsage)の総和を得たとき、私は計算(簡単な例)を実行する必要があります。その後

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

、私はデータベースにyと書き込み、ということを行う必要がありますすべてのお客様に。

私の質問は、これをどのようにして最善の方法で行うことができるかです。

カーソルを使用して各顧客を調べ、合計と計算を実行し、その結果をデータベースに書き込むことがありますか?それは良い解決策でしょうか?

ありがとうございます。ヘルプは非常に高く評価されます!

+1

お客様の数が限られている(カーソルの反復回数が非常に少ない)、一定の間隔で再計算する必要がある場合は、okソリューションのように聞こえます。 –

答えて

4

もう一度カーソルを使用してください。 :-) SQLはセットベースです。できるだけカーソルを避けてください!

ここで簡単にできます。したがって、各顧客に対して、最初にユーザー数を決定してから、簡単な計算を行い、顧客を更新する必要があります。

私の提案は次のようになります。

  • は、総ディスク使用量
  • を計算するために同じことを行うための第2の小さな関数を作成特定の顧客
  • のためにユーザーの数を算出し、少し関数を作成します

    計算を行い、単純な更新ステートメントとして、あなたのストアドプロシージャを記述

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

次のような値のための選択クエリで挿入を行うことができます

+1

+1。カーソルは私にその這う肌、ブギーマンタイプの感じを与える;) –

+0

ありがとうマーク!それはそれを行う良い方法のように思えます。私はそれを試してみましょう。 –

+1

私は可能な限りカーソルを避けるべきであることに同意しますが、正しい解決策であることが(数回)あります。この場合、確かに知るために十分な情報がありませんでした。計算を実行する2つの関数(おそらく選択による)に関しては、関数が呼び出され、実際には集合に基づかない各顧客(与えられたキャッシュによってやや緩和された)に対して計算されるので、いずれかの解決策。 – Tetraneutron

0

特定のデータセットについて報告する「最良の方法」は、データがどのように格納されるか、つまり関連するテーブル定義を参照することなく、実際には話すことができません。

もちろん、このレポートを可能にするためにデータを保存する方法を尋ねている場合を除き、その場合は質問の単語を変更する必要があります。

0

あなたは間違いなくカーソルでこれを行うことができます。サブクエリや事前計算やテンポラリテーブルを使用して1つのステートメントでこれを実行できる可能性もありますが、それ以上の情報を伝えるのは難しいです。

+1

カーソルを避けてください。本当に必要はありません。カーソルはパフォーマンスの悪夢です。 –

2

マルク・

ほとんど:-)、簡単すぎるようだ:

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

またはそのような何か。あなたの質問からそれが本当に明確ではないので、それがあなたの状況のた​​めに働くかどうか100%確信してはいけません。

関連する問題