2

MySQLデータベースに1つのテーブルがあります(単なる例)

CREATE  TABLE test.Names (
    id INT NOT NULL ,  
    salary INT NULL ,  
    name VARCHAR(45) NULL , 
    tmpl INT,
    PRIMARY KEY (`id`) ,  
    UNIQUE INDEX `id_UNIQUE` (`id` ASC)
);

私はこれらの記録を持っています

id,   salary, name, tmpl
1,    10,     John, null 
2,    20,     Pat,  null 
3,    30,     Jane, null

この簡単な計算で一人一人の表を更新したいのですが

salary of each person/Sum(salary)*100

したがって、結果は次のようになります。

id,   salary, name, tmpl
1,    10,     John, 16.67 
2,    20,     Pat,  33.33 
3,    30,     Jane, 50

1つのSQLクエリでこれを実行するにはどうすればよいですか?または、最善のアプローチは何ですか(実際のテーブルには> 100 000行があると思います)

4

3 に答える 3

2

別のSELECTステートメントを使用して、合計給与を取得します。これを変数に入れるか、既存のテーブルと相互結合します。次に、個々のレコードごとに利用可能な合計があります。

このSQLコードで十分です。

SET @sum_salaries = (SELECT SUM(salary) FROM test.Names);

UPDATE test.Names
SET tmpl = salary/@sum_salaries * 100;

参加する必要もありません。この方法はより単純で、おそらくより高速です。

于 2012-09-30T22:57:37.110 に答える
1

これを試して:

SET @SallarySum = (SELECT SUM(salary) FROM TableName);

UPDATE Names t1
INNER JOIN
(
    SELECT id, (Salary / @SallarySum) * 100 tmpl
    FROM Names
) t2 ON t1.Id = t2.Id
SET t1.tmpl = t2.tmpl;

これがSQLFiddleDEMOです。

于 2012-09-30T22:57:57.610 に答える
0

これを試して:

update `test`.`Names`
 set tmpl = salary / (select sum(salary) from `test`.`Names`) * 100
where tmpl is null --for multiple times execution

tmpl列をdoubleデータ型に変更する必要がある場合があります。

于 2012-09-30T22:54:54.630 に答える