2017-02-13 10 views
1

次の表があります。SQL:STDEVP計算に値を追加

Key | Count | Amount 
----| ----- | ------ 
1 |  2 | 10 
1 |  2 | 15 
2 |  5 | 1 
2 |  5 | 2 
2 |  5 | 3 
2 |  5 | 50 
2 |  5 | 20 
3 |  3 | 5 
3 |  3 | 4 
3 |  3 | 5 

申し訳ありませんが、私は上記のテーブルを作成する人を把握できませんでした。

私は金額欄のSTDEVPの復帰を希望しかし、レコードの数は、いくつかの値「X」よりも小さい場合(そこになることはありませんSQL Server Management Studioの2012

でこれを実行しています指定されたキーのxレコード以上)、残りの部分を考慮してゼロを追加します。

例えば、 'X' が6である場合:キー1

  • 、I 2キーのSTDEVP(10,5,0,0,0,0)
  • を必要とする、私はSTDEVPを必要としますキー3用(1,2,3,50,20,0)
  • 、私はちょうど追加できるようにする必要があるSTDEVP(5,4,5,0,0,0)

が必要計算へのゼロ。私は自分のテーブルにレコードを挿入することができましたが、それはむしろ退屈なようです。

答えて

0

これは、各キーの複雑なパディングデータのようです。

with xs as (
     select 0 as val, 1 as n 
     union all 
     select 0, n + 1 
     from xs 
     where xs.n < 6 
    ) 
select k.key, stdevp(coalesce(t.amount, 0)) 
from xs cross join 
    (select distinct key from t) k left join 
    (select t.*, row_number() over (partition by key order by key) as seqnum 
     from t 
    ) t 
    on t.key = k.key and t.seqnum = xs.n 
group by k.key; 

アイデアはcross joinは、各キーの6行を生成していることである。ここでは一つのアプローチです。次に、左結合により、使用可能な行が最大になります。

+0

@Gordonに感謝します。私はちょうどstdevp(amount、rep(0,6-count))のようなことをすることができると妄想していましたが、クロスジョイントから左へのジョインはあまり難しくありません。とても有難い。 –

+0

@spielerspieler。 。 。 'stdevp()'は、複数の*行*からその値をとる集約関数です。あなたの解釈は非常に異なる機能になります。 –

+0

私はこれを知っています、ありがとうございます。私は機能を操作できる何らかの方法があることを期待していました。私はクロス・ジョインを使って左に問題はなく、わずか数分で書くことができました。私は正直なところ、クロス・ジョイントが事だとは知らなかったが、それは完全に意味をなさない。 Rのexpand.gridと似ています。もう一度ありがとうございます。 –

関連する問題