将列的总和与每个部分分开

时间:2014-01-22 19:46:08

标签: sql oracle oracle11g

我的数据库中有以下表格 我目前正在使用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

谢谢

2 个答案:

答案 0 :(得分:1)

假设您的表已经存在,您希望使用INSERT INTO new_table SELECT根据查询在派生表中插入数据。对于执行除法的插入查询,它需要两个子查询:

  1. 查询值的总和
  2. 查询(id,value)对
  3. 因为值的总和是一个值,所有行都是常量,所以您可以将这些子查询与没有条件的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)

SQL Fiddle

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作为字符串:

SQL Fiddle

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 |
相关问题