Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/11/2010, 13h28   #1
Membre à l'essai
 
Inscription : mai 2008
Messages : 216
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 216
Points : 20
Points : 20
Par défaut insertion de données dans une table en verifiant une condition

Bonjour ,

Je suis entrain de développer une requête me permettant de sélectionner des données qui vérifient ma condition dans le filtre .

En fait , je dois récupérer d'une table une valeur TD (pour un ID) correspondant à l'année N-1.
Faire une comparaison avec la valeur TD de l'année N (pour un ID)
Puis inserer dans une autre table si TD(N) >= 40% * TD(N-1)

Voici ma requête :

Code :
1
2
3
4
5
6
7
INSERT INTO TABLE_CIBLE
SELECT * FROM TABLE_SOURCE MCT1
WHERE MCT1.I_TD >= 0.4 * (
SELECT vam.I_TD FROM SOURCE vam
WHERE  MCT1.ID = vam.ID
AND vam.c_month = to_number(to_char(sysdate,'YYYY'))-1 || '12'
)
Voici l'erreur : ORA-01427: single-row subquery returns more than one row
Je ne vois pas comment je pourrais l'éviter
J'espère que j'étais clair dans l'explication de mon besoin
En vous remerciant.
Chikatilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 14h07   #2
Nouveau Membre du Club
 
Inscription : juillet 2007
Messages : 87
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 87
Points : 29
Points : 29
Bonjour,

A priori, la table vam contient plusieurs lignes de TD pour un même ID à une date donnée.
Est-ce normal ?
Si non, tes données doivent d'abord être corrigées.
Si oui, est-ce que la somme de ces TD pourrait servir à ta comparaison ?

exemple :
Code :
1
2
3
4
5
6
7
8
INSERT INTO TABLE_CIBLE
SELECT * FROM TABLE_SOURCE MCT1
WHERE MCT1.I_TD >= 0.4 * (
SELECT sum(vam.I_TD) FROM SOURCE vam
WHERE  MCT1.ID = vam.ID
AND vam.c_month = to_number(to_char(sysdate,'YYYY'))-1 || '12'
GROUP BY vam.ID
)
Si tu ne peux pas faire la somme, alors il faut modifier ta sous-requête pour qu'elle ne ramène qu'une seule valeur par interrogation.
Il faudrait alors plus d'informations sur TD et/ou sur l'organisation de tes tables. (ex : pourquoi deux tables différentes vam et mct1 pour des informations similaires ?)
korian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 14h57   #3
Membre à l'essai
 
Inscription : mai 2008
Messages : 216
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 216
Points : 20
Points : 20
Merci pour ta réponse.

En fait , je dois faire une procédure qui me permette de faire le chargement de ma table cible.
Dans un premier temps , je charge une table temporaire MCT par les données de l'année en cours c'est à dire :
ID C_MONTH TD
1 201001 133
1 201002 144
...
1 201012 154

Puis je dois insérer dans ma table cible les données TD(du mois 201012) >= 40%*TD (200912)
Chikatilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 15h11   #4
Nouveau Membre du Club
 
Inscription : juillet 2007
Messages : 87
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 87
Points : 29
Points : 29
D'accord alors, je confirme, ton problème vient de vam.
Pour un couple ID et 200912, tu récupères plusieurs valeurs (or techniquement l'emploi d'une sous-requête et de l'opérateur de comparaison '=' t'oblige à ne récupérer qu'une seule valeur pour ce couple).

Est ce normal ?
Si oui, est ce que la somme des TD de ce couple veux dire quelque chose fonctionnellement ?
Si oui à nouveau, tu peux utiliser la requête avec sum().
Si non, il va falloir trouver une solution intermédiaire qui ait un sens fonctionnel et qui ne te ramènes que la valeur unique et pertinente.
Expliques alors quelles sont les valeurs dans vam, stp.
korian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 15h46   #5
Membre à l'essai
 
Inscription : mai 2008
Messages : 216
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 216
Points : 20
Points : 20
En fait , afin de faciliter la tache j'insere dans ma table temporaire les(ID , 201012)
Dans vam(=table temp) les colonnes sont (ID C_MONTH et TD) pour chaque (ID , mois) on a une valeur TD bien définit.

Je dois faire une comparaison entre la valeur TD(201012) et TD(200912).
si TD(201012) >= 0.4* TD(200912)
J'insère dans ma table cible.

Je ne dois pas faire de sum
Chikatilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 17h24   #6
Nouveau Membre du Club
 
Inscription : juillet 2007
Messages : 87
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 87
Points : 29
Points : 29
Citation:
Envoyé par Chikatilo Voir le message
En fait , afin de faciliter la tache j'insere dans ma table temporaire les(ID , 201012)

Je dois faire une comparaison entre la valeur TD(201012) et TD(200912).
si TD(201012) >= 0.4* TD(200912)
J'insère dans ma table cible.

Je ne dois pas faire de sum
Ok ça j'ai bien compris

Citation:
Envoyé par Chikatilo Voir le message
Dans vam(=table temp) les colonnes sont (ID C_MONTH et TD) pour chaque (ID , mois) on a une valeur TD bien définit.
Le problème vient de là.
A priori, au vu de l'erreur, tu n'as pas qu'une seule valeur par (Id, mois).
Peux tu faire une requête du style suivant (à peaufiner pour ton cas précis), stp ?
Code :
1
2
3
SELECT ID, MOIS, count(*) FROM vam
GROUP BY ID, MOIS
HAVING Count(*) > 1
Normalement, cette requete ne devrait te ramener aucune occurrence.
Par contre si elle ramène qqchose, chaque ligne sera une ligne en erreur par rapport à ta règle annoncée pour chaque (ID , mois) on a une valeur TD bien définit.
korian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 17h41   #7
Membre à l'essai
 
Inscription : mai 2008
Messages : 216
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 216
Points : 20
Points : 20
j'ai dèjà eu le reflexe de verifier si j'ai des doublons dans ma table.
en utilisant même requete que toi => résultat : 0 lignes
Chikatilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 17h53   #8
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
y'a un truc de pas possible...

Peut être que les doublons se créent dans ton processus de chargement de table temporaire que tu ne détecte pas lorsque tu fais ta requête de vérif plus tard (si elle est créée par du "on commit delete rows" par exemple)
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 08h03   #9
Nouveau Membre du Club
 
Inscription : juillet 2007
Messages : 87
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 87
Points : 29
Points : 29
Citation:
Envoyé par remi4444 Voir le message
y'a un truc de pas possible...
Je suis d'accord.

Il doit nous manquer une information dans ta présentation du problème car ce message n'a pas 36 causes.
Tu ramènes des doublons pour un couple (ID, 200912) dans ta table VAM.


Pour info : c'est quoi le type de vam.c_month ?
korian est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h02.


 
 
 
 
Partenaires

Hébergement Web