2

我有一个表(比如 table_1),其中包含一些类型编号的列。现在我想创建具有列(名称、总和、平均值、最大值、最小值)的其他表(例如 table_2),它将存储 table_1 中列的计算值。

现在我正在创建 table_2,然后在 table_2 中为 table_1 中的每一列一次插入一行。

我想在单个语句更新中做到这一点。查询喜欢:“创建 table_2(名称,总和,平均,...)选择 ....”。请帮我创建执行语句。

4

2 回答 2

1

这是一个 UNPIVOT 操作。

SELECT colname, SUM(value), AVG(value), MIN(value), MAX(value)
  FROM table1
  UNPIVOT ( value FOR colname IN (x,y,..) )
  GROUP BY colname

其中“x,y,...”应该是源表中的实际列名。

编辑添加

在 11g 之前的 Oracle 版本中,您可以滚动自己的 unpivot。两列的示例:

WITH driver AS (
  SELECT level colnum FROM dual CONNECT BY level <= 2
)
SELECT
  CASE WHEN colnum=1 THEN 'x' WHEN colnum=2 THEN 'y' END colname,
  CASE WHEN colnum=1 THEN sum_x WHEN colnum=2 THEN sum_y END colsum,
  CASE WHEN colnum=1 THEN avg_x WHEN colnum=2 THEN avg_y END colavg
FROM driver
CROSS JOIN (
  SELECT SUM(x) sum_x, AVG(x) avg_x, SUM(y) sum_y, AVG(y) avg_y
    FROM mytable
  )
ORDER BY colnum
于 2013-05-31T13:43:12.470 回答
0

这是合法的:你可以做

CREATE TABLE myTable as

SELECT....
;

甚至使用公用表表达式:

CREATE TABLE myTable as
WITH myCte as
(
    SELECT....
)
SELECT....
;
于 2013-05-31T12:10:37.477 回答