2017-02-13 34 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 

對不起,我無法弄清楚誰使表格的正上方。

我在SQL Server Management Studio中2012

運行此我想要的金額列的STDEVP回報,但如果記錄的數量小於某個值「X」(永遠不會有超過給定鍵的x個記錄),那麼我想添加零來說明餘數。

例如,如果 'x' 爲6:

  • 用於密鑰1,I需要STDEVP(10,5,0,0,0,0)
  • 用於密鑰2,I需要STDEVP (1,2,3,50,20,0)
  • 關鍵3,我需要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

謝謝@戈登。我妄想地希望能夠像stdevp(amount,rep(0,6-count))那樣做一些事情,但是交叉連接到左連接並不會太困難。非常感激。 –

+0

@spielerspieler。 。 。 'stdevp()'是一個從多個*行*中獲取其值的聚合函數。你的解釋將是一個非常不同的功能。 –

+0

我知道這一點,謝謝。我只是希望有某種方式可以操縱這個功能。我用cross join加入left join沒有問題,只花了我幾分鐘寫。我真的不知道交叉連接是一件事情,但它完全合理。就像R.中的expand.grid再次感謝。 –