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

Requêtes et SQL. Discussion :

Clause WHERE DATE between


Sujet :

Requêtes et SQL.

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 887
    Points : 206
    Points
    206
    Par défaut Clause WHERE DATE between
    Bonjour (ou bonsoir)

    Je reviens à la charge avec la question suivante :
    Pourquoi, depuis que j'ai mis la clause WHERE , dans mes requêtes, cela ne m'affiche plus les résultats =0 mais uniquement ceux qui ont un résultat > 0 ?
    Avant d'insérer cette clause dont j'ai besoin, j'avais en résultat un tableau feuille de données avec tous mes libellés et la colonne d'en face, le résultat même quand celui-ci était égal à 0...

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour Nessie

    Peux-tu nous montrer un exemple de requête sur laquelle tu as le problème.

    Starec

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 887
    Points : 206
    Points
    206
    Par défaut
    Bien sûr !

    En voici une

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT MEDIA.Libellé, IIf(Count(DETAIL.codemed)=0,"-",Count(DETAIL.codemed)) AS CompteDecodemed, Iif(Count([DETAIL].[codemed])/(SELECT Count(DETAIL.Numdetail) AS CompteDeNumdetail FROM DETAIL)=0,"-", Count([DETAIL].[codemed])/(SELECT Count(DETAIL.Numdetail) AS CompteDeNumdetail FROM DETAIL)) AS [%]
    FROM MEDIA LEFT JOIN DETAIL ON MEDIA.codemed=DETAIL.codemed
    WHERE DATE Between #8/1/2007# And #7/31/2008#
    GROUP BY MEDIA.Libellé
    ORDER BY MEDIA.Libellé;
    Depuis donc cette clause WHERE, le tableau qui me donne le résultat ne compte plus que 3 lignes de média au lieu de 12 avant, avec en face "0" pour les autres médias.

  4. #4
    Membre éclairé Avatar de ft035580
    Profil pro
    Inscrit en
    Août 2004
    Messages
    689
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 689
    Points : 812
    Points
    812
    Par défaut
    Salut,

    Pourquoi ne pas filtrer les données de "DETAIL" par une requête ex:QRY1

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DETAIL.Codemed, DETAIL.Numdetail, DETAIL.Date
    FROM DETAIL
    WHERE (((DETAIL.Date) Between #1/1/2007# And #12/31/2007#));

    pour ensuite baser ta 2e requête sur ce filtre

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT MEDIA.Libellé, IIf(Count(QRY1.codemed)=0,"-",Count(QRY1.codemed)) AS CompteDecodemed, IIf(Count([QRY1].[codemed])/(SELECT Count(QRY1.Numdetail) AS CompteDeNumdetail FROM QRY1)=0,"-",Count([QRY1].[codemed])/(SELECT Count(QRY1.Numdetail) AS CompteDeNumdetail FROM QRY1)) AS [%]
    FROM MEDIA LEFT JOIN QRY1 ON MEDIA.codemed = QRY1.Codemed
    GROUP BY MEDIA.Libellé
    ORDER BY MEDIA.Libellé;

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Avec la clause Where tu fais la sélection avant le regroupement, essaye avec le Having.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT MEDIA.Libellé, IIf(Count(DETAIL.codemed)=0,"-",Count(DETAIL.codemed)) AS CompteDecodemed, Iif(Count([DETAIL].[codemed])/(SELECT Count(DETAIL.Numdetail) AS CompteDeNumdetail FROM DETAIL)=0,"-", Count([DETAIL].[codemed])/(SELECT Count(DETAIL.Numdetail) AS CompteDeNumdetail FROM DETAIL)) AS [%]
    FROM MEDIA LEFT JOIN DETAIL ON MEDIA.codemed=DETAIL.codemed
    GROUP BY MEDIA.Libellé
    HAVING DATE Between #8/1/2007# And #7/31/2008#
    ORDER BY MEDIA.Libellé;
    Sans garantie.

    Starec

  6. #6
    Débutant  
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 887
    Points : 206
    Points
    206
    Par défaut
    Citation Envoyé par ft035580 Voir le message
    Salut,

    Pourquoi ne pas filtrer les données de "DETAIL" par une requête ex:QRY1

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DETAIL.Codemed, DETAIL.Numdetail, DETAIL.Date
    FROM DETAIL
    WHERE (((DETAIL.Date) Between #1/1/2007# And #12/31/2007#));

    pour ensuite baser ta 2e requête sur ce filtre

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT MEDIA.Libellé, IIf(Count(QRY1.codemed)=0,"-",Count(QRY1.codemed)) AS CompteDecodemed, IIf(Count([QRY1].[codemed])/(SELECT Count(QRY1.Numdetail) AS CompteDeNumdetail FROM QRY1)=0,"-",Count([QRY1].[codemed])/(SELECT Count(QRY1.Numdetail) AS CompteDeNumdetail FROM QRY1)) AS [%]
    FROM MEDIA LEFT JOIN QRY1 ON MEDIA.codemed = QRY1.Codemed
    GROUP BY MEDIA.Libellé
    ORDER BY MEDIA.Libellé;
    Je ne sais pas du tout de quoi il s'agit

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 887
    Points : 206
    Points
    206
    Par défaut
    Citation Envoyé par Starec Voir le message
    Bonjour

    Avec la clause Where tu fais la sélection avant le regroupement, essaye avec le Having.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT MEDIA.Libellé, IIf(Count(DETAIL.codemed)=0,"-",Count(DETAIL.codemed)) AS CompteDecodemed, Iif(Count([DETAIL].[codemed])/(SELECT Count(DETAIL.Numdetail) AS CompteDeNumdetail FROM DETAIL)=0,"-", Count([DETAIL].[codemed])/(SELECT Count(DETAIL.Numdetail) AS CompteDeNumdetail FROM DETAIL)) AS [%]
    FROM MEDIA LEFT JOIN DETAIL ON MEDIA.codemed=DETAIL.codemed
    GROUP BY MEDIA.Libellé
    HAVING DATE Between #8/1/2007# And #7/31/2008#
    ORDER BY MEDIA.Libellé;
    Sans garantie.

    Starec
    "Having" ?? .... je ne sais pas. Connais pas !
    Mais ce WHERE a pour utilité de faire une sélection de mes résultats par période. Si je le remplace, je ne pourrai plus avoir la sélection, NON ?

  8. #8
    Débutant  
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 887
    Points : 206
    Points
    206
    Par défaut
    Having, c'est pas pour les critères ?


  9. #9
    Rédacteur/Modérateur
    Avatar de Jeannot45
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2004
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 871
    Points : 8 489
    Points
    8 489
    Par défaut
    Bonjour,

    Si mais le Having joue également le role de WHERE mais dans ce sens, le regroupement se fait avant l' application des critères de sélection des valeurs

  10. #10
    Débutant  
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 887
    Points : 206
    Points
    206
    Par défaut
    Citation Envoyé par Jeannot45 Voir le message
    Bonjour,

    Si mais le Having joue également le role de WHERE mais dans ce sens, le regroupement se fait avant l' application des critères de sélection des valeurs
    Bonjour Jeannot,

    Ok, donc comment devrais-je procéder avec le HAVING pour que j'aie quand même mes requêtes par période mais également toutes mes lignes sans exception d'affichées ?

    Merci.

  11. #11
    Débutant  
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 887
    Points : 206
    Points
    206
    Par défaut
    Re moi,

    Je n'arrive toujours pas à régler ce problème.
    J'ai pourtant vérifié les jointures (je les ai toutes essayées) afin que tous les enregistrements de la table soient affichés, même avec un résultat = 0 mais rien à faire.

    Help !

  12. #12
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    Salut Nessie37,

    ton pb vient du fait que si le média n'a pas de détail il n'a donc pas de date.
    pas de date = pas de ligne d'enregistrement pour ce média => pas ce média dans la liste.

    voilà une solution à ton pb:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT MEDIA.Libellé,
    Iif(Count(DETAIL.codemed)=0,"-",Count(DETAIL.codemed)) AS CompteDecodemed,
    Iif(Count([DETAIL].[codemed])/(SELECT Count(*) FROM DETAIL)=0,"-",Count([DETAIL].[codemed])/(SELECT Count(*) FROM DETAIL)) AS [%]
    FROM MEDIA LEFT JOIN DETAIL ON MEDIA.codemed = DETAIL.codemed
    WHERE (((DETAIL.date) Between #8/1/2007# And #7/31/2008#)) OR IsNull(DETAIL.date)
    GROUP BY MEDIA.Libellé
    ORDER BY MEDIA.Libellé;
    @+

  13. #13
    Débutant  
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 887
    Points : 206
    Points
    206
    Par défaut
    J'essaie et te tiens au courant.

    ++

  14. #14
    Débutant  
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 887
    Points : 206
    Points
    206
    Par défaut
    ça ne marche pas

  15. #15
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    Nessie37,

    il est possible que DETAIL.date ne soit pas null mais vide: DETAIL.date<>""

    post une archive si cela persiste.

  16. #16
    Débutant  
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 887
    Points : 206
    Points
    206
    Par défaut
    Bonjour et bonne année.

    Désolée pour le long silence mais j'ai été pas mal prise.

    Je n'ai pas compris ta question Vodiem

    cdt.

  17. #17
    Débutant  
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 887
    Points : 206
    Points
    206
    Par défaut
    Citation Envoyé par vodiem Voir le message
    Salut Nessie37,

    ton pb vient du fait que si le média n'a pas de détail il n'a donc pas de date.
    pas de date = pas de ligne d'enregistrement pour ce média => pas ce média dans la liste.

    voilà une solution à ton pb:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT MEDIA.Libellé,
    Iif(Count(DETAIL.codemed)=0,"-",Count(DETAIL.codemed)) AS CompteDecodemed,
    Iif(Count([DETAIL].[codemed])/(SELECT Count(*) FROM DETAIL)=0,"-",Count([DETAIL].[codemed])/(SELECT Count(*) FROM DETAIL)) AS [%]
    FROM MEDIA LEFT JOIN DETAIL ON MEDIA.codemed = DETAIL.codemed
    WHERE (((DETAIL.date) Between #8/1/2007# And #7/31/2008#)) OR IsNull(DETAIL.date)
    GROUP BY MEDIA.Libellé
    ORDER BY MEDIA.Libellé;
    @+
    Bonjour Vodiem,

    Je rebondis sur ton post !
    Après avoir repris mon calme, j'ai à nouveau essayé ta requête et elle marche . Problème, tu me proposes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (((DETAIL.date) Between #8/1/2007# And #7/31/2008#)) OR IsNull(DETAIL.date)
    avec des dates figées alors qu'elles sont amenées à bouger, avec un code de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Form_Load()
    Dim dtDate As Date
    dtDate = Date
    If dtDate > DateSerial(Year(dtDate), 7, 31) Then
       Me.Date1 = DateSerial(Year(dtDate), 8, 1)
    Else
       Me.Date1 = DateSerial(Year(dtDate) - 1, 8, 1)
    End If
    Me.Date2 = dtDate
    End Sub
    Cela est-il bien compatible ?

  18. #18
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Bien sûr que c'est compatible. Attention toutefois au mot DATE qui est un mot clé réservé !

  19. #19
    Débutant  
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 887
    Points : 206
    Points
    206
    Par défaut
    Oui mais alors dans ces cas là, les info que j'aurai seront fonction des dates figées et non des dates par défaut.

    A l'origine la clause WHERE était du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (((DETAIL.Date) Between Formulaires![3 TABLEAU DE BORD]!Date1 And Formulaires![3 TABLEAU DE BORD]!Date2))
    Ces dates elles, bougeront.
    Tandis que si je garde
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (((DETAIL.date) Between #8/1/2007# And #7/31/2008#)) OR IsNull(DETAIL.date)
    , je n'aurai mes info que entre ces dates là...

    Non ?

    Actuellement, je suis en train de tout essayer. En essayant de faire un mix :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (((DETAIL.Date) Between Formulaires![3 TABLEAU DE BORD]!Date1 And Formulaires![3 TABLEAU DE BORD]!Date2)) OR IsNull(DETAIL.date)
    eh bien j'ai du coup une feuille de données listant tous mes médias qui n'ont pas de résultat.

    Pour rappel, avant que vodiem ne me donne son tuyau, j'avais au contraire tous les médias qui avaient un résultat.

    Moi, je veux voir lister tous les médias, avec ou sans résultat (d'où l'intérêt du tiret quand pas de résultat).

    De plus, je confirme que les résultats affichés correspondent aux dates figées dans les # et non à celles que j'entre

    Cdt,

  20. #20
    Débutant  
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    887
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 887
    Points : 206
    Points
    206
    Par défaut
    Help ! je rencontre ce prob partout sur toutes mes bases et c'est assez bloquant !

Discussions similaires

  1. Clause Where date + heure
    Par SAS_Nyx dans le forum SQL
    Réponses: 5
    Dernier message: 23/04/2013, 16h13
  2. Réponses: 8
    Dernier message: 16/08/2006, 14h39
  3. [8.i]Fonctions dates et clause Where
    Par jdotti dans le forum Oracle
    Réponses: 6
    Dernier message: 03/08/2006, 18h07
  4. [DTS] Problème avec clause WHERE sur Date
    Par bibou dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 28/06/2006, 12h18
  5. Clause Where sur une Date
    Par Zebulonn dans le forum Installation
    Réponses: 31
    Dernier message: 20/10/2005, 11h56

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