2 votes

Créer une table dans Oracle à partir des opérations sur les colonnes d'une autre table

Je possède une table (disons table_1) avec quelques colonnes de type nombre. Maintenant, je veux créer une autre table (disons table_2) ayant des colonnes (nom, somme, moyenne, max, min) qui stockeront les valeurs calculées des colonnes de la table_1.

Je suis actuellement en train de créer table_2 puis d'insérer une ligne dans table_2 pour chaque colonne de table_1 une par une.

Je veux faire cela en une seule instruction de mise à jour. Requête du type : "Créer table_2(nom, somme, moyenne, ...) sélectionner ....". Veuillez m'aider à créer l'instruction d'exécution.

1voto

Dave Costa Points 25282

Ceci est une opération UNPIVOT.

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

Où "x, y, ..." devrait être les noms de colonnes réels de votre table source.

Modifié pour ajouter

Dans les versions pré-11g d'Oracle, vous pouvez créer votre propre unpivot. Exemple pour deux colonnes :

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

0voto

davek Points 12514

C'est légitime: vous pouvez le faire

CREATE TABLE myTable as

SELECT....
;

ou même en utilisant une expression de table commune :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X