我有一个表(比如 table_1),其中包含一些类型编号的列。现在我想创建具有列(名称、总和、平均值、最大值、最小值)的其他表(例如 table_2),它将存储 table_1 中列的计算值。
现在我正在创建 table_2,然后在 table_2 中为 table_1 中的每一列一次插入一行。
我想在单个语句更新中做到这一点。查询喜欢:“创建 table_2(名称,总和,平均,...)选择 ....”。请帮我创建执行语句。
这是一个 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
这是合法的:你可以做
CREATE TABLE myTable as
SELECT....
;
甚至使用公用表表达式:
CREATE TABLE myTable as
WITH myCte as
(
SELECT....
)
SELECT....
;