Bonjour,
j'ai une tranche de début et fin de période et une durée exple: d: 2006 f:2010 D: 4 Je cherche une astuce pour generer une ligne par année en fction de ma durée
quelqu'un a une idée ?
Merci
Version imprimable
Bonjour,
j'ai une tranche de début et fin de période et une durée exple: d: 2006 f:2010 D: 4 Je cherche une astuce pour generer une ligne par année en fction de ma durée
quelqu'un a une idée ?
Merci
En PL ? En SQL ?
Bonjour,
J'ai pas très bien compris ce que tu cherches à obtenir...
1 lignes pour chaque année x durée ?
je dirais en sql si c'est possible, sinon en pl/sql.
pour faire simple j'ai un debut , une fin du durée dans une table et je dois avoir dans une autre table pour un individu une ligne par année (autant que ma durée)
Un truc comme ça ?
Code:
1
2
3
4
5
6
7
8
9
10 SQL>select 2006 + rownum - 1 2 from all_objects 3 where rownum <= 2010-2006 + 1; 2006+ROWNUM-1 ------------- 2006 2007 2008 2009 2010
oui tout a fait, je n'y avais pas pensé, je part la dessus.
Merci
Bon voici ce que j'ai fais, mais cela ne me parrait pas optimisé, quelqu'un peut il m'aider ?
Merci
Citation:
CREATE OR REPLACE FORCE VIEW "REFERENTIEL"."LISTE_SESSION" ("EHP_UID", "VALEUR") AS
Select EHP_UID,
(CASE WHEN (INSTR(EHP_SESSION_DEBUT,'FACTURE')=1) THEN 'FACTURE'||(replace(EHP_SESSION_DEBUT,'FACTURE','') + rownum - 1)
ELSE TO_CHAR(EHP_SESSION_DEBUT + rownum - 1)
END) as valeur
FROM ECHANGE_PROGRAMME,all_objects
WHERE rownum <= replace(EHP_SESSION_FIN,'FACTURE','')-replace(EHP_SESSION_DEBUT,'FACTURE','') + 1
and EHP_UID like '9F5F%'
Et si pour une fois on tentait de faire du propre....
L'exemple que je donne fonctionne en 10g et 9i
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 create or replace type TNUM is table of number(10); Type created create or replace FUNCTION GEN_TAB (deb in number, fin in number) RETURN TNUM PIPELINED is BEGIN for f in deb..fin loop pipe row (f); end loop; END; / Function created select * from TABLE (GEN_TAB (2010,2016)); COLUMN_VALUE ------------ 2010 2011 2012 2013 2014 2015 2016 7 rows selected
je cherche une technique qui me permet de travailler avec une vue.
je m'explique, le debut et fin est variable suivant chacun de mes individus de ma table.
je peux avoir d=2004,f=2006 pour x puis d=2003,f=2007 pour y ect ..... ce qui devrait me donner pour x une ligne pour 2004,2005,2006 pour y une ligne pour 2003,2004,2005,2006,2007.
Le
select 2006 + rownum - 1
FROM all_objects AO
WHERE rownum <= 2010-2006 + 1;
est une bonne base mais si je fais une jointure sur ma table pour remplacer les valeurs par mes entrées j'explose le temps d'exec. il me manque qqle chose.
Merci
Bonjour,
N'y aurait il pas une solution avec une requete SQL récursive ?
Merci
Pour ne pas exploser les temps de réponses, il faut faire quelque chose comme cela :
Ainsi tu vas éviter un produit cartésien sur des milliers de lignes.Code:
1
2
3
4
5 select ... from maTable, (select 2006 + rownum - 1 annee FROM all_objects AO WHERE rownum <= 2010-2006 + 1) annees where ...
Il est néanmoins vrai que cette méthode n'est d'une part pas satisfaisant pour les puristes et d'autre part pas sans incidence sur les temps de réponse. Si ton nombre d'années est limité, peut-être peux-tu attaquer une vue plus petite ;)
en faite il faudrait remplacer 2006 et 2010 avec les debut et fin qui sont dans table.
sinon peut on faire un compteur en sql ?
Merci
J'ai du mal à saisir ce que tu veux faire :?
Et si tu fais le contraire :
Code:
1
2
3 SELECT dateDeb + rownum - 1 annee FROM (select dateDeb, dateFin from maTable where ...), all_objects where rownum <= dateFin-dateDeb + 1
C'est quelque chose comme cela, mais c'est long
Citation:
SELECT idt,sessionD + rownum - 1 annee
FROM (SELECT EHP_UID as idt,
EHP_SESSION_DEBUT as sessionD,
EHP_SESSION_FIN as sessionF
FROM ECHANGE_PROGRAMME
WHERE EHP_UID like 'A02510B57F%'), all_objects
WHERE rownum <= sessionF-sessionD + 1
J'arrive pas trop à comprendre ton besoin, mais ce qui est sur, c'est que cette utilisation de rownum me semble des plus malsaines.
Je serais toi, je me ferais une table toute bete à une colonne dans laquelle je stockerais des entiers entre 2000 et 2100...
Mais peut etre que le problème est ailleurs donc ça serais bien que tu arrives à exprimer ton besoin clairement.
D'autre part, le fait que ce soit long peut etre du à des simple problème d'index mal placé ou de requête mal tournée...
Je reprends tout:
J'ai une table de personne avec un début et une fin de période.
Je cherche à créer une vue assez simple qui contiendrait autant de ligne que j'ai d'année entre le debut et la fin de période et cela par personne.
Exple:
Table Personne D=2006 F=2010
Vu Personne 2006
Personne 2007
....
Personne 2010
Merci
Okaiii :)
La manière classique basée sur un axe en dur construit dans une table dédiée:
Une manière plus moderne basée sur les fonction "PIPELINE" (je l'ai testé en 10g, je sais pas si cette syntaxe passe en 9i):Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 create table PERS (NOM varchar2(64), DEBUT NUMBER(4), FIN NUMBER (4)) / insert into PERS values ('TOTO', 2001, 2005); insert into PERS values ('TUTU', 2009, 2014); insert into PERS values ('TUTU', 2004, 2008); create table ANNEES (AN NUMBER(4)) / BEGIN for f in 2000..2100 loop insert into ANNEES values (f); end loop; END; / commit; select P.NOM,A.AN from PERS P, ANNEES A where A.AN between P.DEBUT and P.FIN;
Code:
1
2
3 select P.NOM, V.* from PERS P, TABLE (GEN_TAB (P.DEBUT,P.FIN)) V;
Il me fait une erreur sur GEN_TAB
Nota: je suis en 10G
Merci
J'ai oublié de précisé que c'était lié à mon post d'hier ou je construisait la fonction GEN_TAB :roll:Citation:
Envoyé par beegood
la je suis bleuffé .... je ne connais pas du tout ce truc .....
Merci