2013-05-31 50 views
2

我有一個表(稱爲table_1)有一些類型號的列。現在我想創建具有列(名稱,總和,平均值,最大值,最小值)的其他表格(比如table_2),它們將存儲table_1中列的計算值。從其他表中的列操作創建表中的表

現在我正在創建table_2,然後在table_2中爲table_1中的每一列插入一行。

我想在單個語句更新中執行此操作。 Query Like:「Create table_2(name,sum,avg,...)select ....」。 請幫我創建執行語句。

回答

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,...」應該是源表中的實際列名稱。

編輯補充

在Oracle的預11克版本,你可以滾你自己了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 
+0

我使用的是Oracle的10g版本。 –

0

這是合法的:你可以做

CREATE TABLE myTable as 

SELECT.... 
; 

甚至使用公共表表達式:

CREATE TABLE myTable as 
WITH myCte as 
(
    SELECT.... 
) 
SELECT.... 
; 
+0

是的,我知道:)但如何計算總和,平均等..在TABLE_1每列在一個單獨的語句把它放在TABLE_2。 –

+0

如果你不知道你是如何定義你的聚合的話,那麼你有點困難:如果你想要一個「滾動」聚合(即只與已經存在於表中的行相關),那麼你可以使用分析函數來計算最小/最大值在ID較小的所有行上。 – davek