2011-02-10 6 views
1

私のMS SQLストアドプロシージャで配列を使用する機能がないと、効率的な計算方法を見つけることができません。さまざまな入力数を持つMS SQL Serverの効率的な計算

背景....

select child_id, sum(quantity) as quantity 
    from table 
    where parent_id = @parent_id 

戻り、このような何かを....

child_id  quantity 
100   50000 
200   60000 
300   45000 
400   30000 
500   15000 

これは私が助けを必要とするもの説明するための単純化されたSQL式です。数学がないことが重要です(大丈夫、それは意味がない場合 - 私が上から加算された量を使用する必要があるかを示すために簡略化されています)上記child_idのそれぞれについて

set @result = (2 * LOG(50000)) + LOG(60000) + LOG(45000) + LOG(30000) + LOG(15000) 

...、I a(select child_id、@result)を実行します。 「アクティブな」child_idの合計量は、他のchild_ids(2 * LOG())のそれとは異なって扱われることに注意してください。また、child_idの数は2から20までの間で可変です。もしもchild_idが2つしかない場合、@resultは=(2 * LOG(50000)+ LOG(60000))となります。

ありがとうあなたが提供できるすべての提案について多くを提供しています。

+0

上記の例では、child_id 200の結果はどうなりますか? –

+0

Matt、Joe、Martin - ありがとう。私は単純化されていないアルゴリズムでCTEのアプローチがうまくいくかどうか(またはそれがどのように機能するのか)を確かめるために、もう少し考えなければならないでしょう。あなたの質問に答えるために、マットはchild_id 200の結果は=(2 * LOG(60000))+ LOG(50000)+ LOG(45000)+ LOG(30000)+ LOG(15000)となります。もう一度ありがとう。 – karman

答えて

1

CTEsについて少なくともSQL 2005を仮定します。私の狂気の方法は、すべてのログ値に対して1つの合計を取得し、各子のログ値を追加することです和の2 *(この子の値)の部分を実現しています。

;with cteQuantity as (
    select child_id, sum(quantity) as quantity 
     from table 
     where parent_id = @parent_id 
     group by child_id 
), 
cteAllLogs as (
    select sum(log(quantity)) as log_sum 
     from cteQuantity 
) 
select q.child_id, log(q.quantity) + l.log_sum as result 
    from cteQuantity q 
     cross join cteAllLogs l 
+0

ええ、私たちは同じ行に沿って考えています。私たちが同じ答えを出してくれることを安心させてくれます。@ karman、JoeのCTEは、おそらくあなたがSQL Server 2000などで苦労していないと仮定して、よりクリーンな方法です。 –

+0

もう一度ありがとう。私はJoeのCTEの例を完全なアルゴリズムで動作させることができました。私はクエリプランに満足しています。ハイタッチ! – karman

1

まあ、これは正しい方向にあなたを頭かもしれませんが、我々はについて少し詳しく説明しなければならない場合があります計算:

DROP TABLE #results 
CREATE TABLE #results (parent_id INTEGER, child_id INTEGER, quantity FLOAT) 
INSERT INTO #results VALUES (10, 100, 50000) 
INSERT INTO #results VALUES (10, 200, 60000) 
INSERT INTO #results VALUES (10, 300, 45000) 
INSERT INTO #results VALUES (10, 400, 30000) 
INSERT INTO #results VALUES (10, 500, 15000) 

SELECT 
    child_id, quantity, LOG(quantity) + (SELECT SUM(LOG(quantity)) FROM #results subquery WHERE #results.parent_id = subquery.parent_id) 
FROM 
    #results 
+0

これらの 'SELECT child_id、quantity、LOG(quantity)+ SUM(LOG(quantity))の効率についてはまだまだわかりませんが、サブクエリではなくウィンドウ関数を使用することもできます。OVER()FROM #results ' –

+0

@マーチン・ユア適切なインデックスがある限り、私は彼らが同じ仕事量をしていると思うので、選ぶべきことがたくさんあるとは思えません。しかし、クエリプランを見たり、それを測定したりせずに話すのは難しいでしょう。 –

関連する問題