IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Probleme de selection sur les dates sous Oracle 10g


Sujet :

SQL Oracle

  1. #1
    Membre du Club Avatar de Fiona08
    Inscrit en
    Juillet 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 108
    Points : 55
    Points
    55
    Par défaut Probleme de selection sur les dates sous Oracle 10g
    Salut à tous,

    Tout d’abord mes excuses pour le long texte, car j’ai essayé en vain d’expliquer mon Probleme brevement.

    ja travaille sur un project de bilan je dois faire une selection sur les données dans une tabe contenant

    Société fabriquant des médicaments
    1- un Employé nommé A obtient de temps en temps de la sté les produits à offrir aux medecins = Livraison
    2- Apres avoir obtenu les produits, il visite les medecins et leur offre certains de ses Produits en fonction de leur spécialisation = Remise
    3- Ensuite il doit faire son Bilan pour dire le nombre de produit donc il en dispose encore = Stock.
    Les données du Stock coontienne une Colonne Quartal qui est donné manuellement et ne coincide pas toujours avec le Quartal que nous connaissons(voir table).

    exemple de donné de la table de fait pour l’employé A :

    Employé | Nombre | Type | Date | Quartal
    A | 50 | Livraison | 1.01.2008 NV
    A | 2 | Remise | 10.01.2008 | NV
    A | 8 | Remise | 15.01.2008 | NV
    A | 4 | Remise | 10.02.2008 | NV
    A | 6 | Remise | 10.12.2008 | NV
    A | 10 | Remise | 15.02.2009 | NV
    A | 20 | Stock 19.01.2009 Q4-2008

    Les données du Stock est livré avec un Quartal fixé et ne peut etre calculé selon la formule du quartal que nous connaissons. Il doit servir seulement comme « Label » ou Orientation pour l’employé qui veut visualiser son bilan.

    Pour faire le bilan, je dois partir de la date du stock et afficher la Livraison, les remises. Je voudrais donc realiser un rapport comme celui ci sous cognos 8, mais avant tous il faut d'abord faire la selection des données avec Oracle. J’ai un probleme avec les dates.

    Exemple bilan employé A du Quartal Q4-2008(19.01.2009)
    Nombre Type Date
    50 Livraison 1.01.2008
    2 Remise 10.01.2008
    8 Remise 15.01.2008
    4 Remise 10.02.2008
    6 Remise 10.12.2008
    30 Stock 19.01.2009

    Question :
    Comment faire avec Oracle 10 g une selection sur les donné et afficher la Livraison et les Remises qui ont eu lieu jusqu’au 19.01.2009, date à laquelle L’employée A à fait son Bilan. ?

    Voici mon Idée, mais j’obtient une faute
    ORA-01427: single-row subquery returns more than one row.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT F_DATE, F_QUARTAL
    FROM F_Table
    WHERE fst_type = 'Stock' 
    and F_DTIME_ID < (select distinct F_DTIME_ID FROM F_Table
    where f_type = 'Livraison' )
    and and F_DTIME_ID < (select distinct F_DTIME_ID FROM F_Table
    where f_type = 'Remise' )
    Si quelqu’un à une idée, je suis preneuse.
    Merci
    Fiona

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT   nombre, TYPE, DATE
        FROM f_table
       WHERE employe = 'A'
         AND TYPE IN ('Livraison', 'Remise')
         AND DATE < (SELECT DATE
                       FROM f_table
                      WHERE employe = 'A' AND TYPE = stock)
    ORDER BY DATE
    Ceci est valable pour une ligne stock. Il faut l'adapter si vous voulez afficher la liste pour chaque stock.

  3. #3
    Membre du Club Avatar de Fiona08
    Inscrit en
    Juillet 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 108
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par GoLDoZ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT   nombre, TYPE, DATE
        FROM f_table
       WHERE employe = 'A'
         AND TYPE IN ('Livraison', 'Remise')
         AND DATE < (SELECT DATE
                       FROM f_table
                      WHERE employe = 'A' AND TYPE = stock)
    ORDER BY DATE
    Ceci est valable pour une ligne stock. Il faut l'adapter si vous voulez afficher la liste pour chaque stock.
    Salut GoLDoZ,

    tout d'abord merci pour ta reponse.

    j'ai le meme probleme que tout à l'heure:
    ORA-01427: single-row subquery returns more than one row.

    Fiona

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2008
    Messages : 75
    Points : 95
    Points
    95
    Par défaut
    il fallait peut etre ajouter all apres l'operateur "<"
    sinon tu peux utiliser la fonction max
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DATE < all (SELECT DATE
                       FROM f_table
                      WHERE employe = 'A' AND TYPE = stock)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DATE < (SELECT max DATE
                       FROM f_table
                      WHERE employe = 'A' AND TYPE = stock)
    ca depend de ton besoin desolé g pas lu l'enoncé

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Citation Envoyé par Fiona08 Voir le message
    Salut GoLDoZ,

    tout d'abord merci pour ta reponse.

    j'ai le meme probleme que tout à l'heure:
    ORA-01427: single-row subquery returns more than one row.

    Fiona
    Tu as plusieurs lignes de stock. Il faut donc adapter cette requête pour gérer toutes les dates des stocks, et ramener les données entre 2 stocks (à moins qu'à chaque fois tu ne veuilles le total cumulé).
    La fonction LEAD te permettra cela (j'essaie de t'écrire la requête si j'ai le temps).

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Essaie ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH periodes_stock AS
         (SELECT NVL (LAG (DATE, 1) OVER (ORDER BY DATE),
                      TO_DATE ('01/01/2009', 'DD/MM/YYYY')
                     ) datedebut,
                 DATE datefin
            FROM f_table
           WHERE employe = 'A' AND TYPE = stock)
    SELECT nombre, TYPE, DATE
      FROM f_table, periodes_stock
     WHERE employe = 'A'
       AND TYPE IN ('Livraison', 'Remise')
       AND DATE > datedebut
       AND DATE <= datefin;
    Les fonctions LEAD et LAG te permettent de voir les enregistrements suivants ou précédents. Ici, je détermine des périodes de stock en fonction de la date ramenée.
    Au premier coup, la date précédente n'existe pas, je prends donc 01/01/2009 si on veut les stocks à partir de cette date.
    Pour comprendre le mécanisme, essaie la vue toute seule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT NVL (LAG (DATE, 1) OVER (ORDER BY DATE),
                      TO_DATE ('01/01/2009', 'DD/MM/YYYY')
                     ) datedebut,
                 DATE datefin
            FROM f_table
           WHERE employe = 'A' AND TYPE = stock
    NB: ne pas nommer une colonne "DATE", ça crée des problèmes.

  7. #7
    Membre du Club Avatar de Fiona08
    Inscrit en
    Juillet 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 108
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par GoLDoZ Voir le message
    Essaie ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH periodes_stock AS
         (SELECT NVL (LAG (DATE, 1) OVER (ORDER BY DATE),
                      TO_DATE ('01/01/2009', 'DD/MM/YYYY')
                     ) datedebut,
                 DATE datefin
            FROM f_table
           WHERE employe = 'A' AND TYPE = stock)
    SELECT nombre, TYPE, DATE
      FROM f_table, periodes_stock
     WHERE employe = 'A'
       AND TYPE IN ('Livraison', 'Remise')
       AND DATE > datedebut
       AND DATE <= datefin;
    Salut GoLDoZ,

    j'ai éssayé le code ci-dessus, j'obtient toujours la faute suivante:
    ora-00936: Missing expression

    Le probleme est qu'il ne me dit pas à quelle ligne.

    Fiona

  8. #8
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Un de tes noms de colonne n'est pas valide

    fais desc f_table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     
    >  WITH periodes_stock AS
      2        (SELECT NVL (LAG (dt_DATE, 1) OVER (ORDER BY dt_DATE),
      3                     TO_DATE ('01/01/2009', 'DD/MM/YYYY')
      4                    ) datedebut,
      5                dt_DATE datefin
      6           FROM f_table
      7          WHERE employe = 'A' AND TYPE = 'Stock')
      8   SELECT nombre, TYPE, dt_DATE
      9     FROM f_table, periodes_stock
     10    WHERE employe = 'A'
     11      AND TYPE IN ('Livraison', 'Remise')
     12              AND DATE <= datedebut;
                AND DATE <= datedebut
                    *
    ERROR at line 12:
    ORA-00936: missing expression
    si je mets la bonne colonne





    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     WITH periodes_stock AS
      2        (SELECT NVL (LAG (dt_DATE, 1) OVER (ORDER BY dt_DATE),
      3                     TO_DATE ('01/01/2009', 'DD/MM/YYYY')
      4                    ) datedebut,
      5                dt_DATE datefin
      6           FROM f_table
      7          WHERE employe = 'A' AND TYPE = 'Stock')
      8   SELECT nombre, TYPE, dt_DATE
      9     FROM f_table, periodes_stock
     10    WHERE employe = 'A'
     11      AND TYPE IN ('Livraison', 'Remise')
     12              AND dt_DATE <= datedebut;
     
        NOMBRE TYPE                 DT_DATE
    ---------- -------------------- ---------
             2 Remise               10-JAN-08
             4 Remise               10-FEB-08
             6 Remise               10-DEC-08
             8 Remise               15-JAN-08
            50 Livraison            01-JAN-08

    asktom.oracle.com tahiti.oracle.com otn.oracle.com

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.


    phrase chinoise issue du Huainanzi

  9. #9
    Membre du Club Avatar de Fiona08
    Inscrit en
    Juillet 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 108
    Points : 55
    Points
    55
    Par défaut
    Salut GoLDoZ, salut fatsora,

    je viens de voir ma faute, j'ai corrigé et j'obtient les résultats que j'attendais.

    Merci encore
    Fiona

  10. #10
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Citation Envoyé par fatsora Voir le message
    Un de tes noms de colonne n'est pas valide
    Cela m'étonnait aussi d'avoir "DATE" comme nom de colonne.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Selection sur les dates
    Par jeff_! dans le forum Requêtes
    Réponses: 1
    Dernier message: 12/03/2007, 15h04
  2. pb sur les tables sous oracle
    Par pepsister dans le forum Administration
    Réponses: 6
    Dernier message: 09/11/2006, 21h56
  3. probleme de date sous oracle
    Par Melvine dans le forum Oracle
    Réponses: 12
    Dernier message: 26/09/2006, 15h24
  4. Equivalent à TRUNC ou ROUND d'Oracle sur les Dates ?
    Par swirtel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/05/2005, 09h45
  5. MS Access et TQuery (probleme sur les dates)
    Par Djob dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/06/2004, 14h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo