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

Langage SQL Discussion :

UPDATE/SELECT un peu trop complexe pour moi


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 3
    Points
    3
    Par défaut UPDATE/SELECT un peu trop complexe pour moi
    Bonjour,

    j'apprends le SQL un peu sur le tas. J'ai bien eu des cours de SGBD à l'université mais ça n'allait pas au delà des jointures pour autant que je me souvienne.

    J'ai aujourd'hui une table remplie de références, dates et prix, que je dois mettre à jour car les prix qui sont "fermés" m'empêchent de vendre la référence concernée.

    Un schéma valant mieux qu'un long discours, voici un exemple :



    Donc voilà, les dates se suivent au fur et à mesure des mises à jour des tarifs.
    Lorsque la dernière date est "ouverte" (=NULL), le prix renseigné sort, car la requête est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Prix FROM TablePrix WHERE Fournisseur = 'X' AND Article = 'Y' AND DateFin IS NULL
    Vous voyez le problème pour le fournisseur 1, article 2, aucune date de fin n'est ouverte, donc la requête précédente renverra NULL.

    Je cherche à écrire :

    - soit un UPDATE qui ouvre massivement toutes ces "dates de fin" de références où il n'y a aucune "date de fin" ouverte, sachant que c'est la "date de fin" la plus récente qui doit être ouverte bien sûr,

    - soit un SELECT qui me sélectionne, pour une référence donnée, en priorité le prix correspondant à une "date de fin" ouverte, sinon le prix de la "date de fin" la plus récente s'il n'existe pas de "date de fin" ouverte.


    J'ai commencé par essayé un SELECT, mais je galère un peu... Je mélange les MAX(), les TOP 1, les SELECT imbriqués etc...

    Je ne demande pas forcément une solution clé en main, même si ça me ferait gagner du temps c'est sûr, mais au moins une aide par rapport à la construction de la requête, par quoi commencer, par exemple grouper les Fournisseur, Article, puis trier les "date de fin" par ordre décroissante et prendre la première, mais avant ça il faut savoir s'il existe une "date de fin" ouverte ou non, etc...?

    Pour terminer je précise qu'il n'y a dans la réalité pas d'ID, les clés primaires sont le fournisseur, l'article et la "date de début".

    J'espère n'avoir pas été trop fouillis dans ma demande d'aide, et vous remercie par avance !

    Yat'
    Images attachées Images attachées  

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 220
    Points : 28 201
    Points
    28 201
    Par défaut
    Sur le principe ta base semble contenir des prix promotionnels.

    Le principe même de date de fin indique que ce prix là ne s'applique plus.

    Dans ce cas, pour ton problème, ne serait-ce pas plus judicieux et plus propre,
    - de ne pas toucher à ces lignes là qui sont fermées
    - pour les lignes à "ouvrir", faire un INSERT avec le nouveau prix pour rajouter une ligne dans cette table. Bien entendu dans cet INSERT il ne faut pas renseigner de date de fin.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci pour ta réponse.

    En fait ce ne sont pas des prix promo, c'est simplement que, avant que je m'en occupe, la personne qui faisait les mises à jour fermait toutes les dates de fin, puis faisait la mise à jour et du coup ça créé une nouvelle ligne avec le nouveau prix et la nouvelle date de début.

    Le problème c'est que certains articles disparaissent des fichiers fournisseurs au fil des mois (produits anciens ou remplacés par d'autres), mais sont souvent encore en stock chez nous..! Donc leur date de fin est fermée, mais aucune ligne ne vient la rouvrir...
    Depuis j'ai simplement introduit dans la requête de fermeture de dates de fin une limitation aux références présentes dans la mise à jour...

    J'ai une centaine de fournisseurs et environ 120.000 articles. Jusqu'à présent j'ai toujours su me débrouiller au petit bonheur la chance, mais l'inventaire arrive et j'ai tout un tas d'articles qui ne seront pas valorisés si leur date de fin est fermée.

    J'espère avoir apporté des explications supplémentaires à mon problème.

    En vous remerciant par avance pour votre aide !

  4. #4
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 220
    Points : 28 201
    Points
    28 201
    Par défaut
    OK.

    Donc pour rouvrir toutes les références fermées, il va te falloir une requete assez complexe.

    On peut rouvrir systématiquement les dernières dates de fermeture, mais pour que ça marche sur l'ensemble de la table, il va falloir d'abord fermer à une date fictive les lignes qui ne sont pas encore fermées pour qu'elles puissent être traitées par le requete de réouverture.

    Je verrais bien quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE TablePrix SET DateFin='31/12/2199' WHERE DateFin IS NULL;
     
    UPDATE TablePrix SET DateFin=NULL 
    FROM TablePrix t1
        INNER JOIN 
            (SELECT Fournisseur,Article,MAX(DateFin) AS dt 
             FROM TablePrix
             GROUP BY Fournisseur,Article) t2
        ON t1.Fournisseur=t2.Fournisseur AND t1.Article=t2.Article AND t1.DateFin=t2.dt

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Fermer les dates ouvertes pour les rouvrir avec les dates fermées, c'est THE idée qu'il me manquait...

    Je galérai à imaginer une requête qui distingue les références où une date ouverte existe et celle qui n'en ont pas.

    Je vais faire quelques essais et je reviens donner des nouvelles.

    Merci !

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci ça a marché super

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

Discussions similaires

  1. Besoin d'aide sur un select trop complexe pour moi
    Par Oribiahn dans le forum Requêtes
    Réponses: 1
    Dernier message: 24/08/2010, 15h22
  2. Requête trop complexe pour moi
    Par snips67 dans le forum Requêtes
    Réponses: 6
    Dernier message: 27/01/2010, 09h24
  3. Tri complexe trop complexe pour moi
    Par nemo67 dans le forum Développement
    Réponses: 4
    Dernier message: 18/12/2009, 14h03
  4. Une requête trop complexe pour moi
    Par prgasp77 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 14/01/2009, 17h12
  5. Requête un peu trop compliqué pour moi
    Par Kokito dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/04/2005, 15h17

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