我的数据库中有以下表格 我目前正在使用oracle 11g
数据就像这样
id valus
1 2 3
100 200 300 = 600
我想得到一个新列:将列中的每个值除以"值"列的总和"值"。然后加载到另一个表中。其他表中的数据应为
id value drived_col
1 100 100/600
2 200 200/600
3 300 300/600
谢谢
答案 0 :(得分:1)
假设您的表已经存在,您希望使用INSERT INTO new_table SELECT
根据查询在派生表中插入数据。对于执行除法的插入查询,它需要两个子查询:
因为值的总和是一个值,所有行都是常量,所以您可以将这些子查询与没有条件的INNER JOIN连接在一起:
INSERT INTO derived_table
SELECT
ot.id AS id,
ot.value AS value,
CAST(ot.value AS float)/summed.total AS derived_col
FROM
orig_table AS ot
INNER JOIN
SELECT sum(value) AS total FROM orig_table AS summed;
如果CAST(ot.value AS FLOAT)
是整数列,则value
是必需的。否则,您的除法将是整数除法,并且所有派生值都将为零。
此处没有连接条件,因为求和是orig_table
的所有行的单个值。如果要将不同的除数应用于不同的行,则需要更复杂的子查询和适当的连接条件。
答案 1 :(得分:1)
Oracle 11g R2架构设置:
CREATE TABLE data ( id, value ) AS
SELECT 1, 100 FROM DUAL
UNION ALL SELECT 2, 200 FROM DUAL
UNION ALL SELECT 3, 300 FROM DUAL;
CREATE TABLE derived_data AS
SELECT id,
value,
value/SUM(value) OVER ( ORDER BY NULL ) AS derived_col
FROM data;
或者,如果derived_data
表已经存在,那么您可以执行以下操作:
INSERT INTO derived_data
SELECT id,
value,
value/SUM(value) OVER ( ORDER BY NULL ) AS derived_col
FROM data;
查询1 :
SELECT * FROM derived_data
<强> Results 强>:
| ID | VALUE | DERIVED_COL |
|----|-------|----------------|
| 1 | 100 | 0.166666666667 |
| 2 | 200 | 0.333333333333 |
| 3 | 300 | 0.5 |
或者,如果您希望将derived_col
作为字符串:
Oracle 11g R2架构设置:
CREATE TABLE data ( id, value ) AS
SELECT 1, 100 FROM DUAL
UNION ALL SELECT 2, 200 FROM DUAL
UNION ALL SELECT 3, 300 FROM DUAL;
CREATE TABLE derived_data AS
SELECT id,
value,
value||'/'||SUM(value) OVER ( ORDER BY NULL ) AS derived_col
FROM data;
查询1 :
SELECT * FROM derived_data
<强> Results 强>:
| ID | VALUE | DERIVED_COL |
|----|-------|-------------|
| 1 | 100 | 100/600 |
| 2 | 200 | 200/600 |
| 3 | 300 | 300/600 |