SQL - обновление таблицы, чтобы столбец суммировался по ключу другого столбца - PullRequest
3 голосов
/ 30 августа 2010

Учитывая таблицу:

| id | price | item | total |
| 0  |  1.0  |  A   |       |
| 1  |  1.0  |  A   |       |
| 2  |  0.1  |  B   |       |
| 3  |  1.0  |  B   |       |
| 4  |  2.1  |  B   |       |
| 5  |  1.0  |  A   |       |
| 6  |  2.0  |  C   |       |

есть ли оператор SQL, который приведет к этому?.

| id | price | item | total |
| 0  |  1.0  |  A   |  3.0  |
| 1  |  1.0  |  A   |  3.0  |
| 2  |  0.1  |  B   |  3.1  |
| 3  |  1.0  |  B   |  3.1  |
| 4  |  2.1  |  B   |  3.1  |
| 5  |  1.0  |  A   |  3.0  |
| 6  |  2.0  |  C   |  2.0  |

Где каждый элемент имеет все суммы цен.Я могу сделать SELECT ...

SELECT SUM(price), item FROM table GROUP BY item;

, но я не могу понять, как сделать ОБНОВЛЕНИЕ.PS Я использую Postgres.

Спасибо

Ответы [ 3 ]

2 голосов
/ 31 августа 2010

Спасибо за ответы, это заставило меня задуматься.В итоге я смог сделать то, что хотел, используя временную вторую таблицу.

Вот что я сделал.

Создание данных теста:

CREATE TABLE test (id INT PRIMARY KEY,
                   price DECIMAL,
                   item CHAR(1),
                   total DECIMAL);

INSERT INTO test VALUES( 0, 1.0, 'A', NULL ), 
                       ( 1, 1.0, 'A', NULL ),
                       ( 2, 0.1, 'B', NULL ),
                       ( 3, 1.0, 'B', NULL ),
                       ( 4, 2.1, 'B', NULL ),
                       ( 5, 1.0, 'A', NULL ),
                       ( 6, 2.0, 'C', NULL );

Создание временной таблицы:

SELECT SUM(price), item INTO temp_table FROM test GROUP BY item;

Обновление:

UPDATE test SET total = sum FROM temp_table WHERE temp_table.item=test.item;

Очистка:

DROP TABLE temp_table;

Что дает:

select * FROM test ORDER BY id;

 id | price | item | total 
----+-------+------+-------
  0 |   1.0 | A    |   3.0
  1 |   1.0 | A    |   3.0
  2 |   0.1 | B    |   3.2
  3 |   1.0 | B    |   3.2
  4 |   2.1 | B    |   3.2
  5 |   1.0 | A    |   3.0
  6 |   2.0 | C    |   2.0
(7 rows)
2 голосов
/ 30 августа 2010

Создайте триггер AFTER, который выполняет обновление агрегированных строк.

0 голосов
/ 30 августа 2010
UPDATE table SET total = (SELECT SUM(price) FROM test2 WHERE item = 'A' GROUP BY item) WHERE item = 'A';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...