2
CREATE TABLE HrsPerWk_avg
  SELECT CrsTitle, AVG(HoursPerWkincClass)
  FROM FCQ GROUP BY CrsTitle;

エラー コード: 1292。切り捨てられた不正な DOUBLE 値: '7-9'

だから私は週ごとのすべての時間を平均したいのですが、私のデータは7-9、10-12などの形式です. (8) として 7 ~ 9 を、(11) として 10 ~ 12 を平均する値を取得するにはどうすればよいですか?

データのサンプルを次に示します。

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

これはまさに私がやりたいことです。

4

1 に答える 1

1

たとえば、すべての範囲値がコンマ区切りのリストではなく単一の範囲であると仮定すると、いずれかの側の値を取得し、算術演算を使用して手動で平均化する ために、いくつかの部分文字列操作を実行する必要があります。は集計関数であり、この目的には使用できません。-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

于 2013-02-10T21:52:38.190 に答える