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 :

Filtre en imbriquant


Sujet :

Langage SQL

  1. #1
    Membre régulier

    Homme Profil pro
    Restaurateur
    Inscrit en
    Juin 2008
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Restaurateur
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2008
    Messages : 316
    Points : 102
    Points
    102
    Billets dans le blog
    1
    Par défaut Filtre en imbriquant
    Bonjour,
    je vais essayer d'etre clair et court..
    j'enregistre via un logiciel des caisses de serveurs sur une BDD
    chaque modification de caisse d'un serveur est enregistré,
    du coup j'ai plusieurs ligne dans ma BDD pour le serveur ( ceci est voulu )
    j'aimerai avoir une vue simplifiée avec uniquement la derniere caisse du serveur.
    Lors des enregistrement j'ai dans ma BDD un TIMESTAMP ( qui me garde date et heure de chaque enregistrement)

    voilà mon code qui me recupere TOUTES les lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CAISSES_SERVEURS.*, PERSONNEL.NOM, PERSONNEL.PRENOM FROM CAISSES_SERVEURS, PERSONNEL WHERE CAISSES_SERVEURS.ID_KESIZER = PERSONNEL.ID_KESIZER ORDER BY DATE_ENREGISTREMENT DESC"
    cela marche !
    je recupere par exemple

    JULIEN 200 € LE 01/01/2012 enregistré le 01/01/2012
    JULIEN 250 € LE 01/01/2012 enregistré le 02/01/2012
    JULIEN 300 € LE 01/01/2012 enregistré le 02/01/2012
    LUCIEN 130 € LE 01/01/2012 enregistré le 02/01/2012
    LUCIEN 150 € LE 03/01/2012 enregistré le 02/01/2012
    LUCIEN 165 € LE 03/01/2012 enregistré le 03/01/2012

    Je voudrais pouvoir imbriqué dans ma requete une sous requete ( que je ne trouve pas pour avoir simplement


    JULIEN 300 € LE 01/01/2012 enregistré le 02/01/2012
    LUCIEN 130 € LE 01/01/2012 enregistré le 02/01/2012
    LUCIEN 165 € LE 03/01/2012 enregistré le 03/01/2012

    si vous avez une Idée..
    ne pas confondre les dates des caisses du jour et les dates d'enregistrement... ( car quand il est minuit... c'est déjà demain..)

    cdt,

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    quel est votre SGBD ?

  3. #3
    Membre régulier

    Homme Profil pro
    Restaurateur
    Inscrit en
    Juin 2008
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Restaurateur
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2008
    Messages : 316
    Points : 102
    Points
    102
    Billets dans le blog
    1
    Par défaut
    J utilise php avec mysql

  4. #4
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    Le MAX et le GROUP BY sont vos amis !

  5. #5
    Membre régulier

    Homme Profil pro
    Restaurateur
    Inscrit en
    Juin 2008
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Restaurateur
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2008
    Messages : 316
    Points : 102
    Points
    102
    Billets dans le blog
    1
    Par défaut
    peut etre..
    mais mon probleme est le suivant,

    lorsque je recupere Toutes mes lignes,
    et que je les "group" par date..

    je vais avoir un bloc de date_CAISSE, de serveur, et de date_enregistrement.
    il faut que pour une meme date_CAISSE, s'il y a plusieurs fois le meme serveur, garder la date_enregistrement la plus recente.
    puis pour cette meme date_CAISSE, regarder s'il y a un serveur different, et si oui, prendre egalement sa date_enregistrement la plus recente, puis avancer pour chaque date_CAISSE..

    c'est comme un peu un "scan" d'un tableau en effacant des lignes, en les comparant les unes aux autres..

    est-ce que dans une seule requete c'est possible...?

    c'est bien embetant...

  6. #6
    Membre régulier

    Homme Profil pro
    Restaurateur
    Inscrit en
    Juin 2008
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Restaurateur
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2008
    Messages : 316
    Points : 102
    Points
    102
    Billets dans le blog
    1
    Par défaut
    je cherche et j'ai fait ceci.. alors c'est presque ca sauf que...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT CAISSES_SERVEURS.*, PERSONNEL.NOM, PERSONNEL.PRENOM
    FROM CAISSES_SERVEURS, PERSONNEL WHERE
    CAISSES_SERVEURS.ID_KESIZER = PERSONNEL.ID_KESIZER 
    GROUP BY CAISSES_SERVEURS.DATE,
    CAISSES_SERVEURS.SERVICE,PERSONNEL.PRENOM 
    HAVING MAX(CAISSES_SERVEURS.DATE_ENREGISTREMENT)
    ORDER BY DATE_ENREGISTREMENT DESC
    je recupere une ligne unique par personne, par service ( matin ou soir) mais pas le max (date)... car lors de l'analyse de la ligne.. il est automatiquement le max(date) car il n'y a pas de comparaison... a d'autres ligne...
    donc il m en garde qu'une, mais du coup, c'est le 1er enregistrement dans la BDD... pas la plus grande date...

    une aide dans ma structure, peut etre...??


    merci

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Pourriez-vous mettre un jeu de donné explicite, avec le résultat attendu ?

  8. #8
    Membre régulier

    Homme Profil pro
    Restaurateur
    Inscrit en
    Juin 2008
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Restaurateur
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2008
    Messages : 316
    Points : 102
    Points
    102
    Billets dans le blog
    1
    Par défaut
    voici un exemple de recuperation que j'ai.
    a noter que la liste des serveur est longue, et que ce n'est pas filtré sur une journée.. mais sur toute la liste des enregistrements...
    qu'il y a une colonne CAISSE_DATE,NOM,PRENOM,SERVICE,RECETTE,ECART_VERSEMENT,NOMBRE DE COUVERT,ET UN TICKET MOYEN PUIS L HEURE ET LA DATE D ENREGISTREMENT DANS LA BASE DE DONNEE

    Je souhaite conservé toutes les traces ( ici, jusqu' a la regularistation de l'ecart de caisse) donc ces lignes m'interesse...
    mais avoir aussi une autre vue ou seule la ligne d'enregistrement la plus recente ( la 1ere dans l'exemple) ne figure...



    merci

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Passez par une sous-requête, afin de ressortir pour un jour donné les colonnes qui identifient votre employé + le max du timestamp.

    Plus qu'a rebouclé ensuite avec ces critère sur votre table via une jointure.

  10. #10
    Membre régulier

    Homme Profil pro
    Restaurateur
    Inscrit en
    Juin 2008
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Restaurateur
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2008
    Messages : 316
    Points : 102
    Points
    102
    Billets dans le blog
    1
    Par défaut
    je vais essayer...
    je vous tiens au courant,
    merci en tout cas..
    je voulais éviter de passer par une boucle..
    parce qu'il va falloir forcement déterminer obligatoirement une date de début et de fin... ( ce qui n'est pas grave dans l'absolu )

  11. #11
    Membre régulier

    Homme Profil pro
    Restaurateur
    Inscrit en
    Juin 2008
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Restaurateur
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2008
    Messages : 316
    Points : 102
    Points
    102
    Billets dans le blog
    1
    Par défaut
    alors apres plusieurs galere,
    voilà ma requete qui fonctionne...
    qu'en pensez vous y a t il moyen d'alleger le code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT CAISSE.*, PERSO.NOM, PERSO.PRENOM 
    							FROM CAISSES_SERVEURS CAISSE
    							LEFT OUTER JOIN PERSONNEL PERSO
    							ON CAISSE.ID_KESIZER = PERSO.ID_KESIZER
    							WHERE CAISSE.DATE ='$i1'
    							AND CAISSE.DATE_ENREGISTREMENT = 
     
    							(SELECT MAX(CAISSES_SERVEURS.DATE_ENREGISTREMENT) 
    							FROM CAISSES_SERVEURS 
    							WHERE CAISSES_SERVEURS.ID_KESIZER = CAISSE.ID_KESIZER AND CAISSES_SERVEURS.DATE 							='$i1' AND CAISSES_SERVEURS.SERVICE = CAISSE.SERVICE)
     
    							ORDER BY CAISSE.DATE_ENREGISTREMENT DESC
    la variable $i1 est ma date sur laquelle je boucle...( d'une date de debut à une date de fin..)

  12. #12
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Presque oui.

    A adapter avec une plage de date si vous ne voullez pas tous les résultats.

    On ressort pour chaque couple date / employé sa date d'enregistrement max (ici mettez une plage de date avec un between pour une plus grande selectivité)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT ID_KESIZER, DATE 
    MAX(CAISSES_SERVEURS.DATE_ENREGISTREMENT) as max_dte_enr
    FROM CAISSES_SERVEURS
    group by ID_KESIZER, CAISSES_SERVEURS.DATE

    Apres on reboucle avec la requete principale en faisant une jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT CAISSE.*, PERSO.NOM, PERSO.PRENOM
    FROM CAISSES_SERVEURS CAISSE
    INNER JOIN PERSONNEL PERSO ON CAISSE.ID_KESIZER = PERSO.ID_KESIZER
    inner join (SELECT ID_KESIZER, DATE 
    MAX(CAISSES_SERVEURS.DATE_ENREGISTREMENT) as max_dte_enr
    FROM CAISSES_SERVEURS
    group by ID_KESIZER, DATE ) as tmp on tmp.ID_KESIZER = caisse.ID_KESIZER and caisse.DATE_ENREGISTREMENT = tmp.max_dte_enr

  13. #13
    Membre régulier

    Homme Profil pro
    Restaurateur
    Inscrit en
    Juin 2008
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Restaurateur
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2008
    Messages : 316
    Points : 102
    Points
    102
    Billets dans le blog
    1
    Par défaut
    Oui..
    Seulement les dates sont définies dans un input par l utilisateur..
    Et surtout,
    J intègre une autre notion,
    Un serveur peut travailler le midi et le soir..
    C est pour cela que je ne peux pas systématiquement prendre la plus grande valeur de l enregistrement suivant l id, mais passer par un filtre du plus grand enregistrement pour le même service pour le même serveur avec la plus grande date d enregitrement,

    En tout cas merci,
    Mon code fonctionne, ça marche...!

  14. #14
    Membre régulier

    Homme Profil pro
    Restaurateur
    Inscrit en
    Juin 2008
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Restaurateur
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2008
    Messages : 316
    Points : 102
    Points
    102
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par djoumusic Voir le message
    alors apres plusieurs galere,
    voilà ma requete qui fonctionne...
    qu'en pensez vous y a t il moyen d'alleger le code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT CAISSE.*, PERSO.NOM, PERSO.PRENOM 
    							FROM CAISSES_SERVEURS CAISSE
    							LEFT OUTER JOIN PERSONNEL PERSO
    							ON CAISSE.ID_KESIZER = PERSO.ID_KESIZER
    							WHERE CAISSE.DATE ='$i1'
    							AND CAISSE.DATE_ENREGISTREMENT = 
     
    							(SELECT MAX(CAISSES_SERVEURS.DATE_ENREGISTREMENT) 
    							FROM CAISSES_SERVEURS 
    							WHERE CAISSES_SERVEURS.ID_KESIZER = CAISSE.ID_KESIZER AND CAISSES_SERVEURS.DATE 							='$i1' AND CAISSES_SERVEURS.SERVICE = CAISSE.SERVICE)
     
    							ORDER BY CAISSE.DATE_ENREGISTREMENT DESC
    la variable $i1 est ma date sur laquelle je boucle...( d'une date de debut à une date de fin..)
    Je souhaite ne plus boucler sur chaque jour mais utiliser un between...
    Et je galère à trouver le bon emplacement dans la requête ..
    Est ce possible???

  15. #15
    Membre régulier

    Homme Profil pro
    Restaurateur
    Inscrit en
    Juin 2008
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Restaurateur
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2008
    Messages : 316
    Points : 102
    Points
    102
    Billets dans le blog
    1
    Par défaut
    RE.....
    Mon code marchait très bien... mais j ai voulu agrandir les possibilités.. et ça ne marche plus.. enfin, j'ai presque trouvé.. mais... reste un petit bug...

    Dans ma BDD PERSONNEL j'ai un ID ( envoyé par un logiciel... non généré) des NOM et PRENOM puis UR(code d'un etablissement)

    j'enregistre des employés maintenant de plusieurs établissements différents ce qui fait que j'ai dans ma colonne ID des doublons mais des UR différents...


    avec mon code ci dessous ,
    j'obtiens l'affichage des personnes dont les ID ne sont pas identiques..
    si j'ai deux fois le N°1 alors, le nom et prénom de la personne ne s'affichera pas... mais toutes mes autres infos oui...
    il doit y avoir un problème dans mon "LEFT OuTER"... mais je ne trouve pas comment faire..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT CAISSE.*, PERSO.NOM, PERSO.PRENOM,PERSO.UR,PERSO.ID_KESIZER 
    	FROM CAISSES_SERVEURS CAISSE
     
    	LEFT OUTER JOIN (SELECT * FROM PERSONNEL WHERE UR ='$UR') AS PERSO
    	ON CAISSE.ID_KESIZER =PERSO.ID_KESIZER
     
    	WHERE CAISSE.UR ='$UR' AND CAISSE.DATE ='$i1' 
    	AND CAISSE.DATE_ENREGISTREMENT = 
     
    	(SELECT MAX(CAISSES_SERVEURS.DATE_ENREGISTREMENT) 
    	FROM CAISSES_SERVEURS 
    	WHERE CAISSES_SERVEURS.ID_KESIZER = CAISSE.ID_KESIZER AND CAISSES_SERVEURS.DATE 							='$i1' AND CAISSES_SERVEURS.SERVICE = CAISSE.SERVICE AND CAISSES_SERVEURS.UR ='$UR' )
     
    							ORDER BY CAISSE.DATE_ENREGISTREMENT DESC;

Discussions similaires

  1. [AC-2003] Requête paramétrée imbriquées et filtres dynamiques
    Par chetbo dans le forum VBA Access
    Réponses: 2
    Dernier message: 21/02/2013, 14h44
  2. [1.x] Filtre dans un formulaire imbriqué (action: edit)
    Par morfessa dans le forum Symfony
    Réponses: 5
    Dernier message: 11/02/2011, 14h57
  3. Comment appliquer un Filtre imbriqué ?
    Par souminet dans le forum Bases de données
    Réponses: 1
    Dernier message: 19/11/2007, 08h51
  4. Filtre passe Bande
    Par Mau dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 28/06/2002, 17h03
  5. Probleme de filtre dans bdd
    Par scorpiwolf dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/06/2002, 10h43

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