我有一个如下所示的数据透视查询,得到的行count
和AVG
很好,但没有标准偏差STD
。
如何修改下面的SQL以获取STD
?
SELECT mid as mID,
round((x.qty_sum / x.qty_count), 5) as qtAVG,
round(x.qty_stddev, 5) as qtSTDDEV,
x.qty_count as qtCOUNT,
round((x.rel_sum / x.rel_count), 5) as relAVG,
round(x.rel_stddev, 5) as relSTDDEV,
x.rel_count as relCOUNT,
FROM (SELECT mid,
SUM(CASE WHEN (mt = "qt") THEN 1 ELSE 0 END) as qty_count,
SUM(CASE WHEN (mt = "qt") THEN rt ELSE 0 END) as qty_sum,
STD(CASE WHEN (mt = "qt") THEN rt ELSE 0 END) as qty_stddev
SUM(CASE WHEN (mt = "rel") THEN 1 ELSE 0 END) as rel_count,
SUM(CASE WHEN (mt = "rel") THEN rel ELSE 0 END) as rel_sum,
STD(CASE WHEN (mt = "rel") THEN rel ELSE 0 END) as rel_stddev
FROM t_r
GROUP BY mid) x;
答案 0 :(得分:1)
我认为您唯一的问题是ELSE 0
。您只需要NULL
值,因为它们将被忽略:
SELECT mid as mID,
round((x.qty_sum / x.qty_count), 5) as qtAVG,
round(x.qty_stddev, 5) as qtSTDDEV,
x.qty_count as qtCOUNT,
round((x.rel_sum / x.rel_count), 5) as relAVG,
round(x.rel_stddev, 5) as relSTDDEV,
x.rel_count as relCOUNT,
FROM (SELECT mid,
SUM( mt = 'qt' ) as qty_count,
SUM(CASE WHEN mt = 'qt' THEN rt END) as qty_sum,
STD(CASE WHEN mt = 'qt' THEN rt END) as qty_stddev,
SUM( mt = 'rel' ) as rel_count,
SUM(CASE WHEN mt = 'rel' THEN rel END) as rel_sum,
STD(CASE WHEN mt = 'rel' THEN rel END) as rel_stddev
FROM t_r
GROUP BY mid
) x;
请注意其他一些更改:
CASE
表达式。它使用MySQL扩展,将布尔值视为数字,其中1
为真,0
为false。ELSE
子句。聚合函数忽略NULL
值,因此这可以解决您的问题。答案 1 :(得分:0)
似乎您正在尝试通过该子查询使mysql超越智能。就您而言,您不需要这种额外的复杂性,只需使用带有WHERE子句的简单聚合查询即可,该子句可过滤具有mt =“ qt”的记录。
SELECT
mid as mID,
ROUND(AVG(rt), 5) as qtAVG,
ROUND(STD(rt), 5) as qtSTDDEV,
COUNT(*) as qtCOUNT,
FROM t_r
WHERE mt = "qt"
GROUP BY mt