

`subject` と `point`
カラムがあるtestテーブルに対してsubject毎の偏差値（標準偏差ではなく）を取得したいのですが、どうすればいいでしょうか？

標準偏差と平均値は下記のような感じで取れました。

[code]

    SELECT subject, STD(point),  AVG(point) from test_table　GROUP BY subject;
    
[/code]

このsubject毎の標準偏差を使って(point－subject毎の平均point)÷subject毎の標準偏差×10＋50）を計算し、出力もしくはカラムに格納したいです。


CC BY-SA 3.0
2015-04-22T01:23:41.837
9429
2015-04-23T17:11:23.683
2015-04-22T04:49:31.763
525
525
question
mysql
MySQL偏差値を求める方法


携帯で雑に書いていたため解答を修正します。  
手元にMySQLの環境がないのでTransact-SQLで回答します。  
標準偏差（STDEVP）の関数が違うところとCASE式が微妙に違った気がします。

[code]

    /* データ作成 */
    DROP TABLE TEST_TABLE;
    
    CREATE TABLE TEST_TABLE (
        ID VARCHAR(8),
        NAME VARCHAR(32),
        SUBJECT VARCHAR(16),
        POINT INT,
        CONSTRAINT PK_TEST_TABLE PRIMARY KEY (ID, NAME, SUBJECT)
    );
    
    INSERT INTO TEST_TABLE (ID, NAME, SUBJECT, POINT) VALUES ('10001', 'John', 'Japanese', 50);
    INSERT INTO TEST_TABLE (ID, NAME, SUBJECT, POINT) VALUES ('10001', 'John', 'English', 80);
    INSERT INTO TEST_TABLE (ID, NAME, SUBJECT, POINT) VALUES ('10001', 'John', 'Math', 40);
    INSERT INTO TEST_TABLE (ID, NAME, SUBJECT, POINT) VALUES ('10001', 'John', 'Science', 60);
    INSERT INTO TEST_TABLE (ID, NAME, SUBJECT, POINT) VALUES ('10001', 'John', 'History', 50);
    INSERT INTO TEST_TABLE (ID, NAME, SUBJECT, POINT) VALUES ('10002', 'Lisa', 'Japanese', 60);
    INSERT INTO TEST_TABLE (ID, NAME, SUBJECT, POINT) VALUES ('10002', 'Lisa', 'English', 20);
    INSERT INTO TEST_TABLE (ID, NAME, SUBJECT, POINT) VALUES ('10002', 'Lisa', 'Math', 20);
    INSERT INTO TEST_TABLE (ID, NAME, SUBJECT, POINT) VALUES ('10002', 'Lisa', 'Science', 20);
    INSERT INTO TEST_TABLE (ID, NAME, SUBJECT, POINT) VALUES ('10002', 'Lisa', 'History', 100);
    INSERT INTO TEST_TABLE (ID, NAME, SUBJECT, POINT) VALUES ('10003', 'Peter', 'Japanese', 10);
    INSERT INTO TEST_TABLE (ID, NAME, SUBJECT, POINT) VALUES ('10003', 'Peter', 'English', 10);
    INSERT INTO TEST_TABLE (ID, NAME, SUBJECT, POINT) VALUES ('10003', 'Peter', 'Math', 10);
    INSERT INTO TEST_TABLE (ID, NAME, SUBJECT, POINT) VALUES ('10003', 'Peter', 'Science', 10);
    INSERT INTO TEST_TABLE (ID, NAME, SUBJECT, POINT) VALUES ('10003', 'Peter', 'History', 10);
    /* SELECT */
    SELECT
         T1.ID         ID
        ,T1.NAME       NAME
        ,T1.SUBJECT    SUBJECT
        ,T1.POINT      POINT
        ,CASE WHEN T2.STDRD = 0 THEN 50 /* 0除算 禁止 */
         ELSE ROUND((T1.POINT - T2.AVRG) / T2.STDRD * 10 + 50, 0) /* 整数 */
         END STDRD
    FROM
        TEST_TABLE T1
    INNER JOIN
        (
            SELECT
                  SUBJECT
                 ,STDEVP(POINT) STDRD
                 ,AVG(POINT) AVRG
            FROM
                TEST_TABLE
            GROUP BY
                SUBJECT
        ) T2
    ON
        T1.SUBJECT = T2.SUBJECT
    ORDER BY
        ID, NAME, SUBJECT
    ;
    
[/code]


CC BY-SA 3.0
2015-04-22T11:43:02.320
9457
2015-04-23T17:11:23.683
2015-04-23T17:11:23.683
7744
7744
9429
answer