Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:将值添加到STDEVP计算_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

SQL:将值添加到STDEVP计算

SQL:将值添加到STDEVP计算,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有下表 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

我有下表

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返回amount列,但如果记录数小于某个值“x”,则给定键的记录数将永远不会超过x,然后我希望添加零以说明剩余部分

例如,如果“x”为6:

对于键1,我需要stdevp10,5,0,0,0 对于键2,我需要stdevp1,2,3,50,20,0 对于键3,我需要stdevp5,4,5,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;

其思想是交叉连接为每个键生成6行。然后,左连接将引入可用行,最多可达最大值。

这似乎很复杂-为每个键填充数据。以下是一种方法:

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;

其思想是交叉连接为每个键生成6行。然后,左连接将引入可用行,最大值为。

谢谢@Gordon。我幻想着我可以做一些像stdevpamount,rep0,6-count这样的事情,但是交叉连接到左连接不会太困难。非常感谢。@spielerspieler。stdevp是一个聚合函数,它从多行获取其值。你的解释将是一个非常不同的功能。我知道这一点,谢谢。我只是希望有办法操纵这个函数。我用交叉连接到左连接没有问题,只花了我几分钟的时间来写。老实说,我甚至不知道交叉连接是一件事,但它完全有道理。就像R中的expand.grid一样。再次感谢。谢谢@Gordon。我幻想着我可以做一些像stdevpamount,rep0,6-count这样的事情,但是交叉连接到左连接不会太困难。非常感谢。@spielerspieler。stdevp是一个聚合函数,它从多行获取其值。你的解释将是一个非常不同的功能。我知道这一点,谢谢。我只是希望有办法操纵这个函数。我用交叉连接到左连接没有问题,只花了我几分钟的时间来写。老实说,我甚至不知道交叉连接是一件事,但它完全有道理。就像R中的expand.grid一样。再次非常感谢。