Menu

Requête SQL sélection de date [Résolu]

Messages postés
18
Date d'inscription
jeudi 29 novembre 2018
Dernière intervention
5 décembre 2018
- - Dernière réponse : guewen56
Messages postés
18
Date d'inscription
jeudi 29 novembre 2018
Dernière intervention
5 décembre 2018
- 1 déc. 2018 à 22:00
Bonjour,

J'ai un souci lorsque j'effectue ma requête.

But de la requête : Récupération de l'ensemble des dates qui sont inférieur de 8 mois par rapport à la date actuelle si aucune date récente n'est présente.

problème de la requête : Récupère bien la plus récente des date inférieur à 8 mois mais tient pas en compte si une date est est récente où non.

requête :

select medecin.codemed, max(visite.DATEVISITE) from medecin left join visite on medecin.codemed = visite.codemed where (timestampdiff(MONTH, datevisite, curdate()) > 8 ) OR (isnull(datevisite) = 1) group by codemed;


Pouvez vous m'aidez?

Merci d'avance pour vos réponse.
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
23516
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 décembre 2018
1
Merci
Bonjour,

Regarde donc :
 
WHERE datevisite < date_sub(now(), interval 8 month)

Merci jordane45 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM a aidé 30389 internautes ce mois-ci

Commenter la réponse de jordane45
Messages postés
6995
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 décembre 2018
1
Merci
bonjour, peut-être simplement:
select medecin.codemed, max(visite.DATEVISITE) 
from medecin 
left join visite 
on medecin.codemed = visite.codemed 
group by codemed
having   (timestampdiff(MONTH, max(visite.DATEVISITE), curdate()) > 8 ) ;

Tu souhaites bien récupérer la liste des médecins dont la dernière visite date de plus de 8 mois, avec, pour chaque médecin, la date de la dernière visite?
Ce que tu avais programmé: récupérer la liste des médecins visités il y a plus de 8 mois, avec, pour chaque médecin, la dernière visite datant d'il y a plus de 8 mois.
Je pense que ta description était un peu confuse.

Merci yg_be 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM a aidé 30389 internautes ce mois-ci

guewen56
Messages postés
18
Date d'inscription
jeudi 29 novembre 2018
Dernière intervention
5 décembre 2018
-
Bonjour,

Merci pour ta réponse,

avec Having :

Une erreur est apparue, il manquais 1 à 2 parenthèses mais cela n'a pas résolu complétement le problème :



Ensuite sans le Having :

cela revient au problème principal avec le m001 qui réapparait mais les valeurs null apparaissent :



ps : j'ai changé la valeur de
 max(ifnull(visite.DATEVISITE,0))

à
max(ifnull(visite.DATEVISITE,null))


Merci d'avance pour vos réponses.
yg_be
Messages postés
6995
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 décembre 2018
> guewen56
Messages postés
18
Date d'inscription
jeudi 29 novembre 2018
Dernière intervention
5 décembre 2018
-
pourquoi as-tu changé 0 en null?
et ainsi:
select medecin.codemed, max(ifnull(visite.DATEVISITE,0))
from medecin 
left join visite 
on medecin.codemed = visite.codemed 
group by codemed
having   (timestampdiff(MONTH, max(ifnull(visite.DATEVISITE,0)), curdate()) > 8 ) ;
guewen56
Messages postés
18
Date d'inscription
jeudi 29 novembre 2018
Dernière intervention
5 décembre 2018
-
Bonjour

Merci ta réponse,

la requête à fonctionné mais les valeurs nulles ne s'affiche pas :



Merci d'avance pour vos réponses
yg_be
Messages postés
6995
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 décembre 2018
> guewen56
Messages postés
18
Date d'inscription
jeudi 29 novembre 2018
Dernière intervention
5 décembre 2018
-
select medecin.codemed, max(ifnull(visite.DATEVISITE,0))
from medecin 
left join visite 
on medecin.codemed = visite.codemed 
group by codemed
having  (max(ifnull(visite.DATEVISITE,0))=0) 
or (timestampdiff(MONTH, max(ifnull(visite.DATEVISITE,0)), curdate()) > 8 ) ;

sinon, pour comprendre:
select medecin.codemed, max(ifnull(visite.DATEVISITE,0)),
timestampdiff(MONTH, max(ifnull(visite.DATEVISITE,0)), curdate())
from medecin 
left join visite 
on medecin.codemed = visite.codemed 
group by codemed
;
guewen56
Messages postés
18
Date d'inscription
jeudi 29 novembre 2018
Dernière intervention
5 décembre 2018
-
Bonjour

Merci pour ton aide yg_be. Le résultat est obtenu voir ci dessous :



Il affiche donc la totalité de ce qui était attendu.

Je vous remercie pour l'aide fournit.
Commenter la réponse de yg_be
Messages postés
18
Date d'inscription
jeudi 29 novembre 2018
Dernière intervention
5 décembre 2018
0
Merci
Bonjour,

Merci pour ta réponse Jordane45.

La requête à fonctionné, mais le résultat attendu n'a pas fonctionné.

J'ai mit quelques explications sur le résultat sur l'image ci-dessous.



Merci d'avance pour vos réponses.
jordane45
Messages postés
23516
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 décembre 2018
-
Et via un sous select ?
SELECT T.codemed, 
              max(T.DATEVISITE) as DATE_MAX_VISITE
FROM 
  ( SELECT  M.codemed
                  ,V.DATEVISITE
    FROM medecin M
    LEFT JOIN visite V  ON M.codemed = V.codemed 
    WHERE V.datevisite < date_sub(now(), interval 8 month)  OR ISNULL(V.datevisite)  
  )T
GROUP BY T.codemed

Commenter la réponse de guewen56
Messages postés
18
Date d'inscription
jeudi 29 novembre 2018
Dernière intervention
5 décembre 2018
0
Merci
bonjour,

Merci pour ta réponse Jordane45.

La requête à fonctionné, mais le résultat attendu n'a pas fonctionné.

J'ai fait les mêmes tests, le problème persiste. Le m001 devrais disparaitre car la date la plus récente date de moins de 8 mois donc m001 ne devrais pas s'afficher, mais il va quand même chercher la date la plus récente de + de 8 mois.

Voir ci dessous :



Merci d'avance pour vos réponses.
guewen56
Messages postés
18
Date d'inscription
jeudi 29 novembre 2018
Dernière intervention
5 décembre 2018
-
Bonjour,

Merci pour ta réponse Jordane45.

La requête n'a pas fonctionné.

Je veux récupérer le max(datevisite) qui est supérieur à 8 mois donc pour exemple : si on prend aujourd'hui le 30 novembre, 8 mois en arrière sa fait le 30 mars si je ne me trompe pas. Donc on prend tout ce qui est avant le 30 avril si et seulement si aucune date pour un médecin est entre le 30 mars et aujourd'hui. Chaque médecin à plusieurs date de visite mais doit retourner la dernière en date si aucune de ces dates n'est entre le 30 mars et aujourd'hui.

J'espère que c'est compréhensible :-)

Merci d'avance pour vos réponses.
jordane45
Messages postés
23516
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 décembre 2018
-
On va faire plus simple....
- donne nous un DUMP de tes tables

Ensuite, quand tu dis que ça n'a pas fonctionné.... il serait bien que tu nous montres le résultat obtenu ET que tu y indiques en quoi ce n'est pas bon....
guewen56
Messages postés
18
Date d'inscription
jeudi 29 novembre 2018
Dernière intervention
5 décembre 2018
-
bonjour,

Table Médecin : Récupération de l'ensemble des CodeMed, pour vérifier si un médecin n'a jamais eu de visite donc étant null.



Table Visite : Récupération de la dernière date visite comme je l'ai expliqué plus haut.



Résultat Obtenu lors du dernier test :



Résultat précédent :

jordane45
Messages postés
23516
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 décembre 2018
-
Nan mais... un DUMP sql... qu'on puisse utiliser...pas des captures ecran !!!!

https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
guewen56
Messages postés
18
Date d'inscription
jeudi 29 novembre 2018
Dernière intervention
5 décembre 2018
-
Base de donnée :


SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";



-- --------------------------------------------------------

--
-- Structure de la table `medecin`
--

DROP TABLE IF EXISTS `medecin`;
CREATE TABLE IF NOT EXISTS `medecin` (
  `CODEMED` char(4) NOT NULL,
  `NOM` varchar(50) DEFAULT NULL,
  `PRENOM` varchar(50) DEFAULT NULL,
  `ADRESSE` varchar(50) DEFAULT NULL,
  `CODEPOSTAL` varchar(5) DEFAULT NULL,
  `TELEPHONE` varchar(15) DEFAULT NULL,
  `POTENTIEL` varchar(50) DEFAULT NULL,
  `SPECIALITE` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`CODEMED`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Déchargement des données de la table `medecin`
--

INSERT INTO `medecin` (`CODEMED`, `NOM`, `PRENOM`, `ADRESSE`, `CODEPOSTAL`, `TELEPHONE`, `POTENTIEL`, `SPECIALITE`) VALUES
('m001', '', '', '', '', '', '', ''),
('m002', '', '', '', '', '', '', ''),
('m003', '', '', '', '', '', '', ''),
('m004', '', '', '', '', '', '', ''),
('m005', '', '', '', '', '', '', ''),
('m006', '', '', '', '', '', '', ''),
('m007', '', '', '', '', '', '', ''),
('m008', '', '', '', '', '', '', ''),
('m009', '', '', '', '', '', '', ''),
('m010', '', '', '', '', '', '', ''),
('m011', '', '', '', '', '', '', ''),
('m012', '', '', '', '', '', '', ''),
('m013', '', '', '', '', '', '', ''),
('m014', '', '', '', '', '', '', ''),
('m015', '', '', '', '', '', '', ''),
('m016', '', '', '', '', '', '', ''),
('m017', '', '', '', '', '', '', ''),
('m018', '', '', '', '', '', '', ''),
('m019', '', '', '', '', '', '', ''),
('m020', '', '', '', '', '', '', '');

-- --------------------------------------------------------

--
-- Structure de la table `visite`
--

DROP TABLE IF EXISTS `visite`;
CREATE TABLE IF NOT EXISTS `visite` (
  `REFERENCE` char(5) NOT NULL,
  `DATEVISITE` datetime DEFAULT NULL,
  `COMMENTAIRE` varchar(100) DEFAULT NULL,
  `MATRICULE` char(4) NOT NULL,
  `CODEMED` char(4) NOT NULL,
  PRIMARY KEY (`REFERENCE`),
  KEY `MATRICULE` (`MATRICULE`),
  KEY `CODEMED` (`CODEMED`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Déchargement des données de la table `visite`
--

INSERT INTO `visite` (`REFERENCE`, `DATEVISITE`, `COMMENTAIRE`, `MATRICULE`, `CODEMED`) VALUES
('1', '2018-09-04 00:00:00', '', '', 'm001'),
('2', '2000-10-01 00:00:00', '', '', 'm007'),
('3', '2001-05-10 00:00:00', '', '', 'm005'),
('4', '2000-07-11 00:00:00', '', '', 'm004'),
('5', '2006-12-22 00:00:00', '', '', 'm008'),
('6', '2005-12-10 00:00:00', '', '', 'm010'),
('7', '2006-02-03 00:00:00', '', '', 'm014'),
('8', '2008-10-27 00:00:00', '', '', 'm020'),
('9', '2001-06-18 00:00:00', '', '', 'm005'),
('10', '2007-01-20 00:00:00', '', '', 'm008'),
('11', '2002-02-13 00:00:00', '', '', 'm011'),
('12', '2002-10-01 00:00:00', '', '', 'm015'),
('13', '2002-03-10 00:00:00', '', '', 'm012'),
('14', '2008-11-03 00:00:00', '', '', 'm020'),
('15', '2006-04-20 00:00:00', '', '', 'm010'),
('16', '2018-10-14 00:00:00', '', '', 'm001'),
('17', '2002-07-04 00:00:00', '', '', 'm005'),
('18', '2009-12-11 00:00:00', '', '', 'm002'),
('19', '2001-01-10 00:00:00', '', '', 'm007'),
('20', '2010-01-05 00:00:00', '', '', 'm011'),
('21', '2000-09-03 00:00:00', '', '', 'm004'),
('22', '2010-02-05 00:00:00', '', '', 'm002'),
('23', '2002-06-02 00:00:00', '', '', 'm009'),
('24', '2017-12-01 00:00:00', '', '', 'm001');

--
-- Contraintes pour les tables déchargées
--

--
-- Contraintes pour la table `visite`
--
ALTER TABLE `visite`
  ADD CONSTRAINT `VISITE_ibfk_2` FOREIGN KEY (`CODEMED`) REFERENCES `medecin` (`CODEMED`);
COMMIT;




Requette :

SELECT t.codemed
      , t.datevisiteMax
FROM medecin t
INNER JOIN 
(
  SELECT codemed
        ,MAX(datevisite) AS datevisiteMax 
  FROM medecin
  GROUP BY codemed
) temp ON t.codemed = temp.codemed
WHERE t.datevisite = temp.datevisiteMax
Commenter la réponse de guewen56