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)的数值?
以下是数据的示例:
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
时
这正是我想要做的。
发布于 2013-02-10 21:52:38
假设所有的范围值都是单个范围,而不是逗号分隔的列表,那么您需要执行一些子字符串操作来检索-
两边的值,然后用算术方法对它们进行手工平均。AVG()
是一个聚合函数,不能用于此目的。
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()
有条件地匹配类似的值,并使用子字符串操作来修剪+
。
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
https://stackoverflow.com/questions/14802931
复制相似问题