table SQL Ajouter une colonne au lieu de creer une nouvelle table

table SQL Ajouter une colonne au lieu de creer une nouvelle table - SQL/NoSQL - Programmation

Marsh Posté le 11-01-2010 à 11:54:26    

Hello,  
 
je dois creer une table avec certaines proprietes qui sont calculée et extraite de ma base de donnée  
 
pour le momemt pour chaque proprieté je cree une nouvelle table
 
et j'aimerais savoir si c'est possible de le faire avec une seule table en rajoutant a chaque fois une nouvelle colonne, j'ai essayer mais je suis bloqué a un moment.. CF code  
 
 
CREATE TABLE "WEALTH"  // creation de la table (pas de probleme  
(
"SKA" VARCHAR2(30),
"WEALTH_SUM" NUMBER,  
"LI_SUM" NUMBER,  
"AI_SUM" NUMBER,  
"EQ_SUM" NUMBER,  
"BO_SUM" NUMBER,  
"MI_SUM" NUMBER);
 
 
INSERT INTO WEALTH (WEALTH_SUM,SKA)                   // On remplit les 2 premieres colonnes pas de probleme  
SELECT  CLIENT.SKA, SUM(CLIENT_ASSETS.VALUECHF)
FROM CLIENT_ASSETS,CLIENT
WHERE
CLIENT.SKA=CLIENT_ASSETS.SKA
GROUP BY CLIENT.SKA;
 
 
INSERT INTO WEALTH(LI_SUM)                                    // maintenant la 3e colonne il faudrait inclure pour chaque client cette valeur calculée  
SELECT  SUM(CLIENT_ASSETS.VALUECHF)
FROM CLIENT_ASSETS  
   WHERE
           (WEALTH.SKA=CLIENT_ASSETS.SKA
   AND  
           
            CLIENT_ASSETS.AC  
         
             IN  
   (
      select AIS_ACAT_MAP.AISCAT
      from AIS_ACAT_MAP
      where AIS_ACAT_MAP.AC='LI')
    )
GROUP by WEALTH.SKA
;
 

Reply

Marsh Posté le 11-01-2010 à 11:54:26   

Reply

Marsh Posté le 11-01-2010 à 13:19:15    

En relisant mon texte, je me dis que c'est peut etre bon de preciser que la 3e colonne est en faite un sous-ensemble de la 2e...  

Reply

Marsh Posté le 11-01-2010 à 13:38:57    

Tu ne peux pas créer une sorte de table de référence "Type_Propriété" ?
ou tu y insèrerais ton paramétrage sur ta propriété
 
et puis ensuite tu fait un lien entre ta table WEALTH et ta table "Type_Propriété" (en espérant que tu n'est pas besoin de spécificité pour chaque propriété)

Reply

Marsh Posté le 11-01-2010 à 13:43:56    

oui cette solution est possible mais j'aimerais pouvoir ajouter la colonne directement... en faisant 2 tables puis une union des 2 tables je sais le faire.. maintenant j'aimerais savoir s'il est possible d'indexer 2 colonnes differentes (faisant des operations sur des lignes differentes) avec le même identifiant (ma premiere colonne dans ce cas...  
Merci d'avance :-)

Reply

Marsh Posté le 11-01-2010 à 13:54:24    

pourquoi pas une vue ?

Reply

Marsh Posté le 11-01-2010 à 14:13:31    

le rpobleme c'est qu'il faudrait que je puisse l'utiliser comme une table..  
 

Reply

Marsh Posté le 11-01-2010 à 19:01:34    

merci a ceux qui ont deja fait l'effort de lire :-) je debute alors j'ai probablement rater qqch d'evident.  
 
Bon je tente d'expliquer mon probleme differemments  
 
voila un exemple de tableau (
 
fruits / couleurs /nombre  
cerise rouge 10  
cerise verte 5  
cerise rouge 4  
ananas jaune 3  
ananas vert 5  
 
et moi ce que j'aimerais faire c'est un tableau qui me donne  
 
fruit /jaune /vert /rouge/ total  
cerise 0 5 14 19  
ananas 3 5 0 8  
 
 
ça doit etre faisable en une seule requete non? le probleme etant que les sommes ne sont pas sur les memes lignes...
 
 
 
 
 

Reply

Marsh Posté le 12-01-2010 à 11:14:59    

Voici une piste qui pourrait bien résoudre ton problème d'ajout de colonnes dynamiquement :

 

http://forum.hardware.fr/hfr/Progr [...] m#t1668734

 

(et plus généralement, je t'invite à consulter l'ensemble du topic, j'ai tenté d'y apporter le plus d'informations possibles pour prendre en main le SQL et la modélisation avancée)


Message édité par MagicBuzz le 12-01-2010 à 11:15:58
Reply

Marsh Posté le 12-01-2010 à 18:09:51    

si je reprends la table des fruits :
 
create table toto
(fruits varchar2(20),
 couleurs varchar2(20),
 nombre  number
);
 
insert into toto values ('cerise', 'rouge', '10');
insert into toto values ('cerise', 'verte', '5');
insert into toto values ('cerise', 'rouge', '4');
insert into toto values ('ananas', 'verte', '3');
insert into toto values ('ananas', 'jaune', '5');
commit;
 
ensuite avec un fichier script sql (test.sql par exemple) je génère dynamiquement les colonnes de somme (pivot sur décode / sum) :

store set saved_settings replace
set echo off feedback off heading off pages 0 verify off
spool query.sql
prompt break on report
prompt select   fruits
select  ', max (decode (couleurs, ''' || couleurs || ''', cnt, 0)) couleurs_' || couleurs
from   (select distinct couleurs from toto)
/
prompt from     (select   couleurs, fruits, sum(nombre) cnt  
prompt           from    toto
prompt           group by couleurs, fruits)
prompt group by fruits
prompt /
spool off
start saved_settings
start query.sql


 
Résultat :

Code :
  1. SQL> @test.sql
  2. Úcrit file saved_settings
  3. break on report
  4. select   fruits
  5. , max (decode (couleurs, 'jaune', cnt, 0)) couleurs_jaune
  6. , max (decode (couleurs, 'rouge', cnt, 0)) couleurs_rouge
  7. , max (decode (couleurs, 'verte', cnt, 0)) couleurs_verte
  8. from     (select   couleurs, fruits, sum(nombre) cnt
  9. from     system.toto
  10. group by couleurs, fruits)
  11. group by fruits
  12. /
  13. cerise                            0             14              5
  14. ananas                            5              0              3



---------------
Don't fuck me, I'm anonymous.
Reply

Marsh Posté le 12-01-2010 à 18:19:51    

Pour le total c'est un peu plus compliqué et il faut feinter quelque peu :

store set saved_settings replace
set echo off feedback off heading off pages 0 verify off
spool query.sql
prompt break on report
prompt select   fruits
select  ', max (decode (couleurs, ''' || couleurs || ''', cnt, 0)) couleurs_' || couleurs
from   (select distinct couleurs from system.toto)
/
select ', max (decode (couleurs, ''' || min_couleurs || ''', cnt, 0))'
from   (select min (couleurs) min_couleurs from system.toto)
/
select '+ max (decode (couleurs, ''' || other_couleurs || ''', cnt, 0))'
from   (select distinct couleurs other_couleurs from system.toto where couleurs >
        (select min(couleurs) from system.toto))
/
prompt as total
prompt from     (select   couleurs, fruits, sum(nombre) cnt
prompt           from     system.toto
prompt           group by couleurs, fruits)
prompt group by fruits
prompt /
spool off
start saved_settings
start query.sql



Message édité par E-Nyar le 12-01-2010 à 18:22:54

---------------
Don't fuck me, I'm anonymous.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed