【问题标题】:MySql SELECT AVG of CASE statement Group ErrorCASE语句组错误的MySql SELECT AVG
【发布时间】:2012-10-03 15:52:45
【问题描述】:

我正在尝试使用 WHERE 子句和 COUNTMONTHSCASE 语句填充单个平均值,但是它返回对组函数错误代码 1111 的无效使用:

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...我宁愿它只是吐出所有这些 TSCORE 的一个平均值。

使用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

我希望数据仅根据上表吐出一个项目的平均 TSCORE(因此只有 1 行信息):

cnt   ITEM          TSCORE
20    WARI-BB150     0.55

【问题讨论】:

  • 您正在尝试在AVG() 中使用COUNT(*)。为此,您需要两个查询,可能一个嵌套在另一个内部,可能作为子查询的连接。 [您不能在单个查询中聚合聚合。]如果您提供示例输入数据和示例所需结果,那么我们可能会推荐解决方案。
  • 这是有道理的,据我所知,我相信我可能必须在 FROM..ie 中使用子查询。 (SELECT AVG(avg_TSCORE) FROM (SELECT CASE avg_TSCORE WHEN ...)
  • 宾果游戏,我使用您提供的子查询得到它,请参阅我的答案。

标签: mysql select group-by case average


【解决方案1】:

我必须在 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

【讨论】:

    猜你喜欢
    • 2014-03-30
    • 2022-01-17
    • 2020-02-14
    • 1970-01-01
    • 2012-02-05
    • 2023-04-07
    • 2012-01-01
    • 1970-01-01
    • 2013-03-23
    相关资源
    最近更新 更多