首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL将int范围(7-9)变为8并平均

MySQL将int范围(7-9)变为8并平均
EN

Stack Overflow用户
提问于 2013-02-10 21:45:08
回答 1查看 56关注 0票数 2
代码语言:javascript
运行
复制
CREATE TABLE HrsPerWk_avg
  SELECT CrsTitle, AVG(HoursPerWkincClass)
  FROM FCQ GROUP BY CrsTitle;

错误代码: 1292。截断不正确的双值:'7-9‘

所以我想平均每周所有的时间,但是我的数据是7-9,10-12,等等。我如何得到平均7-9为(8)和10-12为(11)的数值?

以下是数据的示例:

代码语言:javascript
运行
复制
HoursPerWkInclClass
7-9
4-6
7-9
7-9
10-12
10-12
7-9
10-12
4-6
16+

添加(8+5+8+8+11+11+8+11+5+16)=91/10=9.1

这正是我想要做的。

EN

回答 1

Stack Overflow用户

发布于 2013-02-10 21:52:38

假设所有的范围值都是单个范围,而不是逗号分隔的列表,那么您需要执行一些子字符串操作来检索-两边的值,然后用算术方法对它们进行手工平均。AVG()是一个聚合函数,不能用于此目的。

代码语言:javascript
运行
复制
CREATE TABLE HrsPerWk_avg
SELECT
  CrsTitle,
  /* Extract the min/max values with substring operations, add them, divide by 2 */
  /* SUBSTRING_INDEX() gets the first value before - */
  (SUBSTRING_INDEX(HoursPerWkincClass, '-', 1) +
  /* SUBSTR() and LOCATE() get the second value after - */
  /* Both are added and divided by 2 */
  SUBSTR(HoursPerWkincClass, LOCATE('-', HoursPerWkincClass)+1)) / 2
FROM FCQ 
GROUP BY CrsTitle

下面是一个示例:http://sqlfiddle.com/#!2/96510/2

更新

要像上面发布的那样支持像16+这样的值,您需要使用LOCATE()有条件地匹配类似的值,并使用子字符串操作来修剪+

代码语言:javascript
运行
复制
SELECT
  CrsTitle,
  CASE
    /* Remove + if present */
    WHEN LOCATE('+', HoursPerWkincClass) >= 1 THEN REPLACE(HoursPerWkincClass, '+', '')
    ELSE
      /* Otherwise use the range finding stuff from above... */
      (SUBSTRING_INDEX(HoursPerWkincClass, '-', 1) +
      SUBSTR(HoursPerWkincClass, LOCATE('-', HoursPerWkincClass)+1)) / 2
  END AS the_avg
FROM FCQ

http://sqlfiddle.com/#!2/bdd43/2

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14802931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档