2011-09-14 4 views
0

私はテーブルMYSQLテーブルを持っています。列を越えてMysqlでstddevを使用する

name, t1 , t2 , t3. 

多くの名前とそのスコアがあります。

ショーは、T1、T2、T3

しようとしたセレクト名、STDDEV(T1、T2、T3)の標準偏差を計算するだろう、それは仕事をdidntの。

これは動作します:

SELECT 
    NAME, STDDEV_SAMP(t) STD 
FROM 
(SELECT NAME, t1 AS t FROM test._copy 
    UNION ALL 
    SELECT NAME, t2 AS t FROM test._copy 
    UNION ALL 
    SELECT NAME, t3 AS t FROM test._copy 
) t 
GROUP BY NAME 

答えて

3

STDEV()は集約関数です。それは多くの行から値をとり、単一の結果をもたらします。

SELECT 
    name, 
    STDEV(t1) standard_deviation_of_t1, 
    STDEV(t2) standard_deviation_of_t2, 
    STDEV(t3) standard_deviation_of_t3 
FROM 
    yourTable 
GROUP BY 
    name 

-- This will give meaningful results if there are several records for the 
-- same name. 

残念ながら、いくつかのフィールドから値を取りません。ただ、いくつかの行は、

SELECT 
    name, 
    STDEV(t) standard_deviation_of_all_t_values, 
FROM 
(
    SELECT name, t1 AS t FROM yourTable 
    UNION ALL 
    SELECT name, t2 AS t FROM yourTable 
    UNION ALL 
    SELECT name, t3 as t FROM yourTable 
) 
    AS data 
GROUP BY 
    name 

EDIT

別のオプション...あなたは、単一の列のすべての値を持つようにあなたのデータを再作業する必要があることを行うには、代わりのUNION ALLがある可能性があります。 ..

SELECT 
    name, 
    STDEV(CASE map.field_id WHEN 1 THEN t1 WHEN 2 THEN t2 ELSE t3 END) 
FROM 
    your_table 
CROSS JOIN 
    (SELECT 1 as field_id UNION ALL SELECT 2 UNION ALL SELECT 3) AS map 
GROUP BY 
    name 
+0

+1 MySQLで動作させることができませんでした。私が見る限り、派生テーブルの外側の列への参照を許可していないようです。 –

+0

@ demあなたはそれをシンプルにすることができますか?全く?それは動作しますが、編集のために – Merlin

+0

@Merlin - 私は代替案を投稿しました。しかし、それは '作品ではあるが編集のためにはどういう意味ですか? – MatBailie

0

終わりGROUP BY nameを追加してみてください。

関連する問題