2012-10-12 63 views
2

我试图填充基于掀起了CASE声明使用了COUNTMONTHS一个WHERE第一个平均,但它返回一个无效使用组功能错误代码1111:MySQL的SELECT AVG

SELECT 
count(ORDER_NUMBER) as cnt, 
a.ITEM, 
MONTH(TRANS_DATE) as Month, 
AVG(CASE 
WHEN count(ORDER_NUMBER) IS NULL THEN 0 
WHEN count(ORDER_NUMBER) < 1 AND a.CAT != 'E' THEN 0 
WHEN count(ORDER_NUMBER) < 1 AND a.CAT = 'E' THEN .05 
WHEN count(ORDER_NUMBER) >= 1 AND count(ORDER_NUMBER) < 4 AND a.CAT = 'E' THEN .5 
WHEN count(ORDER_NUMBER) >= 4 AND a.CAT = 'E' THEN 1 
WHEN count(ORDER_NUMBER) <= 5 AND a.CAT != 'E' THEN .05 
WHEN count(ORDER_NUMBER) >= 6 AND count(ORDER_NUMBER) < 11 AND a.CAT != 'E' THEN .25 
WHEN count(ORDER_NUMBER) >= 11 AND count(ORDER_NUMBER) < 21 AND a.CAT != 'E' THEN .5 
WHEN count(ORDER_NUMBER) >= 21 AND a.CAT != 'E' THEN 1 END) as TSCORE 
FROM trx.TRX_Import t2 
    JOIN ATTRIBUTES a 
    ON a.ITEM = t2.ITEM 
WHERE `TRANS_DATE` BETWEEN DATE_SUB(CURDATE(), INTERVAL 365 DAY) AND CURDATE() 
AND t2.ITEM = 'WARI-BB150' 

当我添加额外GROUP BY MONTH它正确识别每个月TSCORE ...我宁愿它只吐出所有这些TSCORES中的一个平均值。

随着GROUP BY MONTH,它吐出:

cnt  ITEM  Month TSCORE 
    1 WARI-BB150  1  0.5 
    2 WARI-BB150  2  0.5 
    1 WARI-BB150  3  0.5 
    2 WARI-BB150  4  0.5 
    2 WARI-BB150  5  0.5 
    2 WARI-BB150  6  0.5 
    4 WARI-BB150  7  1 
    2 WARI-BB150  10  0.5 
    3 WARI-BB150  11  0.5 
    1 WARI-BB150  12  0.5 

我宁愿数据吐出正是基于上述表的项目(所以只有1行信息的)的平均TSCORE:

cnt ITEM   TSCORE 
20 WARI-BB150  0.55 
+1

您正在尝试使用'COUNT(*)''内AVG()'。要做到这一点,你需要两个查询,可能是一个嵌套在另一个中,可能作为子查询的连接。 * [您无法在单个查询中聚合聚合。] *如果您提供示例输入数据和示例所需结果,那么我们可能会推荐解决方案。 – MatBailie

+0

这是有道理的,从我知道我相信我必须在FROM..ie中使用子查询。 ('SELECT AVG(avg_TSCORE)FROM(SELECT CASE avg_TSCORE when ...') – ToddN

+0

宾果,我用你提供的子查询得到它,看到我的答案 – ToddN

回答

4

我有FROM子句中使用子查询和创建上,一个AVG

SELECT 
t2.ITEM as Item, 
AVG(t2.TSCORE) as AvgTSCORE 
FROM 
(SELECT count(ORDER_NUMBER) as cnt, t3.ITEM, MONTH(TRANS_DATE) as Month, 
(CASE 
WHEN count(ORDER_NUMBER) IS NULL THEN 0 
WHEN count(ORDER_NUMBER) < 1 AND a.CAT != 'E' THEN 0 
WHEN count(ORDER_NUMBER) < 1 AND a.CAT = 'E' THEN .05 
WHEN count(ORDER_NUMBER) >= 1 AND count(ORDER_NUMBER) < 4 AND a.CAT = 'E' THEN .5 
WHEN count(ORDER_NUMBER) >= 4 AND a.CAT = 'E' THEN 1 
WHEN count(ORDER_NUMBER) <= 5 AND a.CAT != 'E' THEN .05 
WHEN count(ORDER_NUMBER) >= 6 AND count(ORDER_NUMBER) < 11 AND a.CAT != 'E' THEN .25 
WHEN count(ORDER_NUMBER) >= 11 AND count(ORDER_NUMBER) < 21 AND a.CAT != 'E' THEN .5 
WHEN count(ORDER_NUMBER) >= 21 AND a.CAT != 'E' THEN 1 END) as TSCORE 
FROM trx.TRX_Import t3 
JOIN ATTRIBUTES a 
    ON a.ITEM = t3.ITEM 
WHERE `TRANS_DATE` BETWEEN DATE_SUB(CURDATE(), INTERVAL 365 DAY) AND CURDATE() 
AND t3.ITEM = 'WARI-BB150' 
GROUP BY MONTH 
) t2 

吐出:

Item   AvgTSCORE 
WARI-BB150 0.55000 
+1

+1 - 干得好:) – MatBailie