STDEVP用于计算字段

时间:2017-12-04 16:50:19

标签: sql sql-server data-partitioning stdevp

我有一个看起来像这样的表:

ID       CHANNEL    VENDOR  num_PERIOD  SALES.A SALES.B
000001  Business    Shop    1            40       30
000001  Business    Shop    2            60       20
000001  Business    Shop    3            NULL     30

ID,CHANNEL和VENDOR的多种组合,以及每种组合的销售记录(num_PERIOD)。

我想得到一个新字段的平均标准偏差,它返回SALES.A + SALES.B sum(IS.NULL(SALES.A,0) + ISNULL(SALES.B,0))的总和。

我遇到的问题是STDEVP似乎因计算字段而失败,返回的结果无效。

我一直在尝试:

select ID, CHANNEL, VENDOR, stdevp(sum(isnull(SALES.A,0) + ISNULL(QSALES.B,0))) OVER (PARTITION BY  ID, CHANNEL, VENDOR) as STDEV_SALES
      FROM TABLE
GROUP BY ID, CHANNEL, VENDOR

但是,我所看到的结果始终为0NULL

我想要获得的是每个ID,CHANNEL和VENDOR的平均标准偏差(num_PERIOD)

有人可以找到这个的近似值吗?

1 个答案:

答案 0 :(得分:0)

您的查询与样本数据不匹配。

但是,我可以看到问题所在。 SUM()正在计算每个组的单个值,然后您将获取该值的标准偏差。因为您无法嵌套聚合函数,所以您已将其转换为窗口函数。

摆脱sum()。以下内容适用于SQL Server:

SELECT ID, CHANNEL, VENDOR, 
       STDEVP(COALESCE(SALES.A, 0) + COALESCE(QSALES.B, 0))  as STDEV_SALES
FROM SALES . . .
     QSALES
GROUP BY ID, CHANNEL, VENDOR;

我也会返回COUNT(*)。 。 。如果行数少于3行,则标准偏差没有意义。 (好的,它定义为两个值,但不是很有用。)