Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 01/07/2008, 15h45   #1
Futur Membre du Club
 
Inscription : octobre 2007
Messages : 64
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 64
Points : 15
Points : 15
Par défaut Problème de requête


Voilà j'ai un petit souci sur une requete.

Pour expliquer la situation cela concerne une gestion d'articles. A savoir qu'un article en panne passe en "Intervention" pour être réparé et ce qu'on m'a demandé c'est que l'on affiche la moyenne des délais entre chaque intervention sur un article (entre la fin de l'une et le début de la suivante) sur les 3 derniers mois.
Et pour les articles n'ayant qu'une seule intervention on lui attribue le délai suivant : Date du début de traitement - la date d'il y a 3 mois.
Et pour les articles n'ayant eu aucune intervention on leur met 3 mois de delai (soit 90 jours).

donc je leur ai sorti le code suivant qui marche très bien


Tables et champs : WS=> Table "Intervention"
--> DT_WS_BEGIN = Date de début d'intervention
--> DT_WS_END = Date de fin d'intervention
--> CD_WO = N° intervention
--> CD_BOX = N° Article

BOX=> Table "Article"
--> CD_BOX = N° article

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
 
SELECT round(avg(T1.delai))DELAI,'ARTICLE'TYPE
FROM(
    SELECT  L2.BOX BOX,L1.cd_wo, decode(L1.delai,'',90,L1.delai)DELAI
    FROM(
       SELECT B.CD_BOX BOX, CD_WO, WS.DT_WS_BEGIN D, WS.DT_WS_END F, 
         case
           when to_date( WS.DT_WS_BEGIN) - to_date((lag(WS.DT_WS_END, 1) over(partition BY B.CD_BOX ORDER BY WS.DT_WS_BEGIN))) IS NULL
           then round(WS.DT_WS_BEGIN-(sysdate-90))
           else to_date( WS.DT_WS_BEGIN) - to_date((lag(WS.DT_WS_END, 1) over(partition BY B.CD_BOX ORDER BY WS.DT_WS_BEGIN)))
         end delai
       FROM WS, BOX B
       WHERE  B.CD_BOX=WS.CD_BOX
          AND DT_WS_BEGIN BETWEEN (sysdate-90) AND sysdate
           /*###*/ --expliqué plus bas
       GROUP BY B.CD_BOX, CD_WO, WS.DT_WS_BEGIN, WS.DT_WS_END
       ORDER BY B.CD_BOX, CD_WO, WS.DT_WS_BEGIN
        )L1,
        (
          SELECT CD_BOX BOX
          FROM BOX
        )L2
    WHERE L1.BOX(+)=L2.BOX
     AND decode(L1.delai,'',90,L1.delai) >= 1
  )T1
Le problème est qu'aujourd'hui on me demande de changer ça en faisant la même chose mais pas par rapport à la date du jour mais par rapport à une date entrée par l'utilisateur.

Je précise que ma requete est intégrée dans une appli qui affiche que le résultat et où j'ai possibilité d'ajouter une zone de saisie qui remplacera les /*###*/ par un "and champs(que j'aurais administré) = saisie de l'utilisateur"


Donc pour résumer le problème je dois remplacer mon sysdate par une entrée manuelle.
Pas évident à expliquer mais bon j'espère avoir été le plus clair possible
oOBaalberithOo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2008, 16h06   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 320
Points : 5 839
Points : 5 839
Pas évident! Sys_Context ça te va ou pas ?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2008, 16h19   #3
Futur Membre du Club
 
Inscription : octobre 2007
Messages : 64
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 64
Points : 15
Points : 15
euh non je pense pas. Je connaissais pas cette fonction mais après avoir chercher je ne pense pas qu'elle puisse m'aider
oOBaalberithOo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2008, 16h44   #4
Membre expérimenté
 
Inscription : juillet 2007
Messages : 495
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2007
Messages : 495
Points : 585
Points : 585
Je suppose que tu es dans une procédure PL/SQL.
Si c'est le cas, la date utilisateur doit être passée en paramètre en entrée de ta procédure stockée, et tu substitue ensuite ce paramètre à sysdate directement dans la requête.
__________________
Des chercheurs qui cherchent, on en trouve, mais des chercheurs qui trouvent, on en cherche !
dgi77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2008, 16h57   #5
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 320
Points : 5 839
Points : 5 839
Citation:
Envoyé par oOBaalberithOo Voir le message
euh non je pense pas. Je connaissais pas cette fonction mais après avoir chercher je ne pense pas qu'elle puisse m'aider
Pour quoi ? Il suffit de remplacer sysdate par Sys_Context('mon_context','ma_date') dans ta requête et de prendre soin de mettre ta valeur dans le contexte avant d'exécuter la requête.
Si non tu peux construire ton select dynamiquement, peut être.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2008, 18h20   #6
Futur Membre du Club
 
Inscription : octobre 2007
Messages : 64
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 64
Points : 15
Points : 15
Merci les gars pour vos réponse ! dsl de répondre que maintenant mais après vos réponse j'ai quitté le boulot et en revenant il m'ont changé l'objectif de ma requete au taf et du coup plus besoin, et comme un couillon ayant autre chose en tête j'ai oublié de vous remercier, mieux vaut tard que jamais on va dire ^^ ceci dit j'aurais appris ce qu'est la fonction sys_context, merci mnitu

en tout cas merci les gars
oOBaalberithOo 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 03h33.


 
 
 
 
Partenaires

Hébergement Web