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

Développement SQL Server Discussion :

Requête sur date de validité et quantité


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2020
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Requête sur date de validité et quantité
    Bonjour,

    J'ai une table comportant des prix avec des dates de validité ainsi que des quantités. Je cherche à extraire la seule ligne correspondante aux critères du moment.
    Par exemple :
    Nom : table_prix_quantite.jpg
Affichages : 102
Taille : 30,0 Ko
    Sachant que nous sommes le 22/09 et que la quantité est par exemple de 12, le prix sera 177.90.
    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Comme ceci :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select T1prix
    from ma_table
    where @date between T1dtdeb and T1dtfin
      and @qte <= T1qte
      and T1qte = 
         (select min(T1qte)
          from ma_table
          where @date between T1dtdeb and T1dtfin
           and @qte <= T1qte
         )
    avec @date = date requise (par exemple date du jour) et @qte=quantité souhaitée

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2020
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci mais j'ai dû mal exposer ma demande car sur mon image, la bonne ligne à remonter est une ligne où les dates de validité sont nulles.
    En effet, nous sommes le 22/09 et donc, les 2 lignes ou ces dates sont mentionnées ne correspondent pas car date expirée...
    J'y suis parvenu avec un union et des priorités mais avec aussi, une immense impression de bricolage...
    Pour que des cheveux se dressent, je vous la livre :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    SELECT top(1) * FROM (
       SELECT * FROM (
          SELECT TOP(1)
             *
            ,1 AS priorité
          FROM
             table
          WHERE
             getdate()>=DebutValidité
             AND getdate() <=FinValidité
             AND QuéJusquà>=(Quantité de mon panier)
             AND DebutValidité IS NOT NULL
             AND FinValidité IS NOT NULL
             AND PR_ID=7
          ORDER BY QuéJusquà)
       AS tbl
     
       UNION 
     
       SELECT * FROM (
          SELECT TOP(1)
             *
            ,2 AS priorité
          FROM
             table
          WHERE
             QuéJusquà>=(Quantité de mon panier)
             AND DebutValidité IS NULL
             AND FinValidité IS NULL
             AND PR_ID=7
          ORDER BY QuéJusquà)
       AS tbl2
    ) AS tbl3
    ORDER BY priorité
    Merci.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Qu'une date de fin soit marquée "null" c'est assez courant, le sens est le même qu'une valeur par défaut telle que "9999-12-31", mais une date de début marquée "null", je ne comprends ni le sens fonctionnel, ni ce qu'on peut en faire...

    Pour la date de fin, il suffit d'utiliser la fonction COALESCE dans ma requête précédente, ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select T1prix
    from ma_table
    where @date between T1dtdeb and coalesce(T1dtfin, '9999-12-31')
      and @qte <= T1qte
      and T1qte = 
         (select min(T1qte)
          from ma_table
          where @date between T1dtdeb and coalesce(T1dtfin, '9999-12-31')
           and @qte <= T1qte
         )
    Pour la date de début, peut-être que coalesce(T1dtdeb, '0001-01-01') est applicable selon le besoin fonctionnel qui encore une fois est obscur pour moi

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2020
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Je suis tout à fait d'accord mais je fais avec les données contenues dans un ERP (EBP) que je ne maitrise pas et donc, je suis obligé de m'adapter.
    Merci encore. C'était ma première venue ici et je reviendrai.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Qu'une date de fin soit marquée "null" c'est assez courant, le sens est le même qu'une valeur par défaut telle que "9999-12-31", mais une date de début marquée "null", je ne comprends ni le sens fonctionnel, ni ce qu'on peut en faire...
    Absolument, je vous invite si vous voulez utilisez des plages de validité à :
    1. rendre vos colonnes not null
    2. ajouter une contrainte qui vérifie que la date de fin est strictement supérieure à la date de début
    3. à traiter vos intervalles de temps fermé à gauche et ouvert à droite
    4. à indiquer vos plages de quantité avec borne de début et borne de fin exactement comme pour les dates
    5. ajouter une contrainte qui vérifie que quantité maximale est strictement supérieure à la quantité initiale

    Ces conseils vous faciliteront la vie en simplifiant vos requêtes et évitant des erreurs.
    Avec ces conseils votre table deviendrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    PR_ID  Prix Net  Qte_min  Qte_max  Dt_Deb_Vald  Dt_Fin_Vald
    -----  --------  -------  -------  -----------  -----------
        7    191.50        1        9  2001-01-01   2021-01-01
        7    177.90        9  9999999  2001-01-01   2021-01-01
        7    165.00        1        9  2021-01-01   2021-09-13
        7    160.00        9  9999999  2021-01-01   2021-09-13
        7    191.50        1        9  2021-09-13   9999-12-31
        7    177.90        9  9999999  2021-09-13   9999-12-31
    Et la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select prix
      from ma_table
     where @date >= Dt_Deb_Vald
       and @date <  Dt_Fin_Vald
       and @qte  >= Qte_min
       and @qte  <  Qte_max;
    Edit : je viens de voir votre réponse avec l'ERP... dommage !

  7. #7
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2020
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Oui, merci à vous mais en effet, comme vous l'avez compris, moi "de loin" qui m'occupe de nourrir un site internet via un sp_addlinkedserver qui me lie au serveur SQL de l'ERP et une connexion en lecture seule, je ne peux rien changer (mais c'est plutôt normal) et je peux tomber à tout instant sur un "je sais pas" dans un champ texte...
    Alors un datetime null... ce n'est pas grave.

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

Discussions similaires

  1. [REQ] Requête sur date et heure
    Par benazerty dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 26/06/2006, 13h34
  2. [sql server] requête sur dates et heures (format du résultat
    Par isachat666 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/02/2006, 13h48
  3. Requète sur dates compliquée ...
    Par itklif2 dans le forum Requêtes
    Réponses: 7
    Dernier message: 28/11/2005, 23h31
  4. [ADO] Requète sur dates
    Par cdlr27 dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/01/2005, 22h39
  5. Requête sur date
    Par guenfood dans le forum Access
    Réponses: 11
    Dernier message: 08/12/2004, 16h11

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