我有一個表(稱爲table_1)有一些類型號的列。現在我想創建具有列(名稱,總和,平均值,最大值,最小值)的其他表格(比如table_2),它們將存儲table_1中列的計算值。從其他表中的列操作創建表中的表
現在我正在創建table_2,然後在table_2中爲table_1中的每一列插入一行。
我想在單個語句更新中執行此操作。 Query Like:「Create table_2(name,sum,avg,...)select ....」。 請幫我創建執行語句。
我有一個表(稱爲table_1)有一些類型號的列。現在我想創建具有列(名稱,總和,平均值,最大值,最小值)的其他表格(比如table_2),它們將存儲table_1中列的計算值。從其他表中的列操作創建表中的表
現在我正在創建table_2,然後在table_2中爲table_1中的每一列插入一行。
我想在單個語句更新中執行此操作。 Query Like:「Create table_2(name,sum,avg,...)select ....」。 請幫我創建執行語句。
這是一個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
這是合法的:你可以做
CREATE TABLE myTable as
SELECT....
;
甚至使用公共表表達式:
CREATE TABLE myTable as
WITH myCte as
(
SELECT....
)
SELECT....
;
是的,我知道:)但如何計算總和,平均等..在TABLE_1每列在一個單獨的語句把它放在TABLE_2。 –
如果你不知道你是如何定義你的聚合的話,那麼你有點困難:如果你想要一個「滾動」聚合(即只與已經存在於表中的行相關),那麼你可以使用分析函數來計算最小/最大值在ID較小的所有行上。 – davek
我使用的是Oracle的10g版本。 –