Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

question requête

7 réponses
Avatar
Nicolas
Bonjour tout le monde,

J'ai une requête à faire qui me chagrinne un peu (beaucoup même !)
Voila disons que j'ai une table T_Planning, avec un champ nomEmploye et un
champ datePlanning.
T_Planning(nomEmploye,datePlanning)
Dans cette table il ne peut y avoir que un enregistrement par jour pour un
employé et c'est la que le bas blesse il peut que pour une date donnée
l'employé n'est pas d'enregistrement.
Or dans ma requete je vourdrais obtenir chaque jour du mois même ceux qui
n'existe pas dans la table.
Un exemple:
Contenu de ma table :

Dupont 01/02/2004
Dupont 03/02/2004
Dupont 08/02/2004
Dupont 29/02/2004

=>4 enregistrements pour le mois de février 2004 pour dupont

Je voudrais obtenir avec ma requete le jeu d'enregistrement suivant:
Dupont 01/02/2004
Dupont 02/02/2004
Dupont 03/02/2004
Dupont 04/02/2004
Dupont 05/02/2004
Dupont 06/02/2004
Dupont 07/02/2004
Dupont 08/02/2004
...
Dupont 29/02/2004

=>29 enregistrements pour le mois de février 2004 pour dupont

Existe-il une astuce pour faire ceci ?????
Merci de votre aide.

7 réponses

Avatar
Patrice Scribe
Généralement, on utilise dans ce cas une table "calendrier" qui contient
toutes les dates voulues et il ne reste qu'à faire la jointure...

Patrice

--

"Nicolas" a écrit dans le message de
news:e%
Bonjour tout le monde,

J'ai une requête à faire qui me chagrinne un peu (beaucoup même !)
Voila disons que j'ai une table T_Planning, avec un champ nomEmploye et un
champ datePlanning.
T_Planning(nomEmploye,datePlanning)
Dans cette table il ne peut y avoir que un enregistrement par jour pour un
employé et c'est la que le bas blesse il peut que pour une date donnée
l'employé n'est pas d'enregistrement.
Or dans ma requete je vourdrais obtenir chaque jour du mois même ceux qui
n'existe pas dans la table.
Un exemple:
Contenu de ma table :

Dupont 01/02/2004
Dupont 03/02/2004
Dupont 08/02/2004
Dupont 29/02/2004

=>4 enregistrements pour le mois de février 2004 pour dupont

Je voudrais obtenir avec ma requete le jeu d'enregistrement suivant:
Dupont 01/02/2004
Dupont 02/02/2004
Dupont 03/02/2004
Dupont 04/02/2004
Dupont 05/02/2004
Dupont 06/02/2004
Dupont 07/02/2004
Dupont 08/02/2004
...
Dupont 29/02/2004

=>29 enregistrements pour le mois de février 2004 pour dupont

Existe-il une astuce pour faire ceci ?????
Merci de votre aide.





Avatar
Nicolas
Oui c'est exactement ce que j'ai fait, merci
J'ai donc créé une table T_calendrier contenant tous les jours du mois
désiré et il m'a suffit de faire une jointure (left outter join) avec ma
table T_Planning.
Le seul hic est que dans ma table T_Planning les champs nomEmploye et
datePlanning sont tous les deux la clés primaires de ma table.
Je suis donc obligé de faire ceci :

SELECT *
FROM T_calendrier LEFT OUTER JOIN
T_T_Planning ON T_calendrier.dateJour = T_Planning
.datePlanning AND T_Planning .nomEmploye = "Dupont"
ORDER BY T_calendrier.dateJour

Comment faire si je veux faire la même chose sur tout mes employés ?

Merci



"Patrice Scribe" a écrit dans le message de
news:%
Généralement, on utilise dans ce cas une table "calendrier" qui contient
toutes les dates voulues et il ne reste qu'à faire la jointure...

Patrice

--

"Nicolas" a écrit dans le message de
news:e%
> Bonjour tout le monde,
>
> J'ai une requête à faire qui me chagrinne un peu (beaucoup même !)
> Voila disons que j'ai une table T_Planning, avec un champ nomEmploye et


un
> champ datePlanning.
> T_Planning(nomEmploye,datePlanning)
> Dans cette table il ne peut y avoir que un enregistrement par jour pour


un
> employé et c'est la que le bas blesse il peut que pour une date donnée
> l'employé n'est pas d'enregistrement.
> Or dans ma requete je vourdrais obtenir chaque jour du mois même ceux


qui
> n'existe pas dans la table.
> Un exemple:
> Contenu de ma table :
>
> Dupont 01/02/2004
> Dupont 03/02/2004
> Dupont 08/02/2004
> Dupont 29/02/2004
>
> =>4 enregistrements pour le mois de février 2004 pour dupont
>
> Je voudrais obtenir avec ma requete le jeu d'enregistrement suivant:
> Dupont 01/02/2004
> Dupont 02/02/2004
> Dupont 03/02/2004
> Dupont 04/02/2004
> Dupont 05/02/2004
> Dupont 06/02/2004
> Dupont 07/02/2004
> Dupont 08/02/2004
> ...
> Dupont 29/02/2004
>
> =>29 enregistrements pour le mois de février 2004 pour dupont
>
> Existe-il une astuce pour faire ceci ?????
> Merci de votre aide.
>
>
>



Avatar
Patrice Scribe
Tu peux ne joindre que sur la date ce qui te donnera tous les employés
concernés par une journée :

SELECT *
FROM T_calendrier LEFT OUTER JOIN
T_T_Planning ON T_calendrier.dateJour T_Planning.datePlanning
ORDER BY T_calendrier.dateJour,T_planning.nomEmployee

Est-ce que tu veux ?

--

"Nicolas" a écrit dans le message de
news:
Oui c'est exactement ce que j'ai fait, merci
J'ai donc créé une table T_calendrier contenant tous les jours du mois
désiré et il m'a suffit de faire une jointure (left outter join) avec ma
table T_Planning.
Le seul hic est que dans ma table T_Planning les champs nomEmploye et
datePlanning sont tous les deux la clés primaires de ma table.
Je suis donc obligé de faire ceci :

SELECT *
FROM T_calendrier LEFT OUTER JOIN
T_T_Planning ON T_calendrier.dateJour = T_Planning
.datePlanning AND T_Planning .nomEmploye = "Dupont"
ORDER BY T_calendrier.dateJour

Comment faire si je veux faire la même chose sur tout mes employés ?

Merci



"Patrice Scribe" a écrit dans le message de
news:%
> Généralement, on utilise dans ce cas une table "calendrier" qui contient
> toutes les dates voulues et il ne reste qu'à faire la jointure...
>
> Patrice
>
> --
>
> "Nicolas" a écrit dans le message de
> news:e%
> > Bonjour tout le monde,
> >
> > J'ai une requête à faire qui me chagrinne un peu (beaucoup même !)
> > Voila disons que j'ai une table T_Planning, avec un champ nomEmploye


et
un
> > champ datePlanning.
> > T_Planning(nomEmploye,datePlanning)
> > Dans cette table il ne peut y avoir que un enregistrement par jour


pour
un
> > employé et c'est la que le bas blesse il peut que pour une date donnée
> > l'employé n'est pas d'enregistrement.
> > Or dans ma requete je vourdrais obtenir chaque jour du mois même ceux
qui
> > n'existe pas dans la table.
> > Un exemple:
> > Contenu de ma table :
> >
> > Dupont 01/02/2004
> > Dupont 03/02/2004
> > Dupont 08/02/2004
> > Dupont 29/02/2004
> >
> > =>4 enregistrements pour le mois de février 2004 pour dupont
> >
> > Je voudrais obtenir avec ma requete le jeu d'enregistrement suivant:
> > Dupont 01/02/2004
> > Dupont 02/02/2004
> > Dupont 03/02/2004
> > Dupont 04/02/2004
> > Dupont 05/02/2004
> > Dupont 06/02/2004
> > Dupont 07/02/2004
> > Dupont 08/02/2004
> > ...
> > Dupont 29/02/2004
> >
> > =>29 enregistrements pour le mois de février 2004 pour dupont
> >
> > Existe-il une astuce pour faire ceci ?????
> > Merci de votre aide.
> >
> >
> >
>




Avatar
Nicolas
Oui mais cette requete ne marche pas, j'ai deja essayé comme ca.
Il ne prend pas en compte le left outer join, il le considere comme un inner
join





"Patrice Scribe" a écrit dans le message de
news:%
Tu peux ne joindre que sur la date ce qui te donnera tous les employés
concernés par une journée :

SELECT *
FROM T_calendrier LEFT OUTER JOIN
T_T_Planning ON T_calendrier.dateJour > T_Planning.datePlanning
ORDER BY T_calendrier.dateJour,T_planning.nomEmployee

Est-ce que tu veux ?

--

"Nicolas" a écrit dans le message de
news:
> Oui c'est exactement ce que j'ai fait, merci
> J'ai donc créé une table T_calendrier contenant tous les jours du mois
> désiré et il m'a suffit de faire une jointure (left outter join) avec ma
> table T_Planning.
> Le seul hic est que dans ma table T_Planning les champs nomEmploye et
> datePlanning sont tous les deux la clés primaires de ma table.
> Je suis donc obligé de faire ceci :
>
> SELECT *
> FROM T_calendrier LEFT OUTER JOIN
> T_T_Planning ON T_calendrier.dateJour = T_Planning
> .datePlanning AND T_Planning .nomEmploye = "Dupont"
> ORDER BY T_calendrier.dateJour
>
> Comment faire si je veux faire la même chose sur tout mes employés ?
>
> Merci
>
>
>
> "Patrice Scribe" a écrit dans le message de
> news:%
> > Généralement, on utilise dans ce cas une table "calendrier" qui


contient
> > toutes les dates voulues et il ne reste qu'à faire la jointure...
> >
> > Patrice
> >
> > --
> >
> > "Nicolas" a écrit dans le message de
> > news:e%
> > > Bonjour tout le monde,
> > >
> > > J'ai une requête à faire qui me chagrinne un peu (beaucoup même !)
> > > Voila disons que j'ai une table T_Planning, avec un champ nomEmploye
et
> un
> > > champ datePlanning.
> > > T_Planning(nomEmploye,datePlanning)
> > > Dans cette table il ne peut y avoir que un enregistrement par jour
pour
> un
> > > employé et c'est la que le bas blesse il peut que pour une date


donnée
> > > l'employé n'est pas d'enregistrement.
> > > Or dans ma requete je vourdrais obtenir chaque jour du mois même


ceux
> qui
> > > n'existe pas dans la table.
> > > Un exemple:
> > > Contenu de ma table :
> > >
> > > Dupont 01/02/2004
> > > Dupont 03/02/2004
> > > Dupont 08/02/2004
> > > Dupont 29/02/2004
> > >
> > > =>4 enregistrements pour le mois de février 2004 pour dupont
> > >
> > > Je voudrais obtenir avec ma requete le jeu d'enregistrement suivant:
> > > Dupont 01/02/2004
> > > Dupont 02/02/2004
> > > Dupont 03/02/2004
> > > Dupont 04/02/2004
> > > Dupont 05/02/2004
> > > Dupont 06/02/2004
> > > Dupont 07/02/2004
> > > Dupont 08/02/2004
> > > ...
> > > Dupont 29/02/2004
> > >
> > > =>29 enregistrements pour le mois de février 2004 pour dupont
> > >
> > > Existe-il une astuce pour faire ceci ?????
> > > Merci de votre aide.
> > >
> > >
> > >
> >
>
>



Avatar
Patrice Scribe
Tu n'aurais pas des dates qui ne sont pas identiques ? Le code ci-dessous
semble ok...

create table T_Calendrier(Jour SMALLDATETIME)
CREATE TABLE T_Planning(Jour SMALLDATETIME,Qui VARCHAR(10))
GO
INSERT INTO T_Calendrier VALUES ('20040101')
INSERT INTO T_Calendrier VALUES ('20040102')
INSERT INTO T_Calendrier VALUES ('20040103')
INSERT INTO T_Calendrier VALUES ('20040104')

INSERT INTO T_Planning VALUES ('20040101','Moi')
INSERT INTO T_Planning VALUES ('20040103','Moi')
INSERT INTO T_Planning VALUES ('20040103','Elle')
INSERT INTO T_Planning VALUES ('20040103','Lui')
INSERT INTO T_Planning VALUES ('20040104','Eux')
GO
SELECT * FROM T_Calendrier
LEFT OUTER JOIN T_Planning ON T_Planning.Jour=T_Calendrier.Jour

me donne bien :

Jour Jour
Qui
------------------------------------------------------ ---------------------
--------------------------------- ----------
2004-01-01 00:00:00 2004-01-01 00:00:00
Moi
2004-01-02 00:00:00 NULL
NULL
2004-01-03 00:00:00 2004-01-03 00:00:00
Moi
2004-01-03 00:00:00 2004-01-03 00:00:00
Elle
2004-01-03 00:00:00 2004-01-03 00:00:00
Lui
2004-01-04 00:00:00 2004-01-04 00:00:00
Eux

--

"Nicolas" a écrit dans le message de
news:
Oui mais cette requete ne marche pas, j'ai deja essayé comme ca.
Il ne prend pas en compte le left outer join, il le considere comme un


inner
join





"Patrice Scribe" a écrit dans le message de
news:%
> Tu peux ne joindre que sur la date ce qui te donnera tous les employés
> concernés par une journée :
>
> SELECT *
> FROM T_calendrier LEFT OUTER JOIN
> T_T_Planning ON T_calendrier.dateJour > > T_Planning.datePlanning
> ORDER BY T_calendrier.dateJour,T_planning.nomEmployee
>
> Est-ce que tu veux ?
>
> --
>
> "Nicolas" a écrit dans le message de
> news:
> > Oui c'est exactement ce que j'ai fait, merci
> > J'ai donc créé une table T_calendrier contenant tous les jours du mois
> > désiré et il m'a suffit de faire une jointure (left outter join) avec


ma
> > table T_Planning.
> > Le seul hic est que dans ma table T_Planning les champs nomEmploye et
> > datePlanning sont tous les deux la clés primaires de ma table.
> > Je suis donc obligé de faire ceci :
> >
> > SELECT *
> > FROM T_calendrier LEFT OUTER JOIN
> > T_T_Planning ON T_calendrier.dateJour T_Planning
> > .datePlanning AND T_Planning .nomEmploye = "Dupont"
> > ORDER BY T_calendrier.dateJour
> >
> > Comment faire si je veux faire la même chose sur tout mes employés ?
> >
> > Merci
> >
> >
> >
> > "Patrice Scribe" a écrit dans le message de
> > news:%
> > > Généralement, on utilise dans ce cas une table "calendrier" qui
contient
> > > toutes les dates voulues et il ne reste qu'à faire la jointure...
> > >
> > > Patrice
> > >
> > > --
> > >
> > > "Nicolas" a écrit dans le message de
> > > news:e%
> > > > Bonjour tout le monde,
> > > >
> > > > J'ai une requête à faire qui me chagrinne un peu (beaucoup même !)
> > > > Voila disons que j'ai une table T_Planning, avec un champ


nomEmploye
> et
> > un
> > > > champ datePlanning.
> > > > T_Planning(nomEmploye,datePlanning)
> > > > Dans cette table il ne peut y avoir que un enregistrement par jour
> pour
> > un
> > > > employé et c'est la que le bas blesse il peut que pour une date
donnée
> > > > l'employé n'est pas d'enregistrement.
> > > > Or dans ma requete je vourdrais obtenir chaque jour du mois même
ceux
> > qui
> > > > n'existe pas dans la table.
> > > > Un exemple:
> > > > Contenu de ma table :
> > > >
> > > > Dupont 01/02/2004
> > > > Dupont 03/02/2004
> > > > Dupont 08/02/2004
> > > > Dupont 29/02/2004
> > > >
> > > > =>4 enregistrements pour le mois de février 2004 pour dupont
> > > >
> > > > Je voudrais obtenir avec ma requete le jeu d'enregistrement


suivant:
> > > > Dupont 01/02/2004
> > > > Dupont 02/02/2004
> > > > Dupont 03/02/2004
> > > > Dupont 04/02/2004
> > > > Dupont 05/02/2004
> > > > Dupont 06/02/2004
> > > > Dupont 07/02/2004
> > > > Dupont 08/02/2004
> > > > ...
> > > > Dupont 29/02/2004
> > > >
> > > > =>29 enregistrements pour le mois de février 2004 pour dupont
> > > >
> > > > Existe-il une astuce pour faire ceci ?????
> > > > Merci de votre aide.
> > > >
> > > >
> > > >
> > >
> >
> >
>




Avatar
Nicolas
Ton code marche bien effectivement !
En fait j'ai mal exprimé mon problème. Je voudrais que pour chaque "qui "
j'ai autant d'enregistrement qu'il y a dans la table T_calendrier. Ca donne
un truc du genre.

t_calendrier.jour qui
----------------- ----
01/01/2004 Moi
02/01/2004 Moi
03/01/2004 Moi
04/01/2004 Moi

01/01/2004 Lui
02/01/2004 Lui
03/01/2004 Lui
04/01/2004 Lui
01/01/2004 Elle
02/01/2004 Elle
03/01/2004 Elle
04/01/2004 Elle
01/01/2004 Eux
02/01/2004 Eux
03/01/2004 Eux
04/01/2004 Eux

Mais c'est bon, j'ai compris d'ou venait mon problème.
En tout cas je te remercie car c'est grace à toi que je me suis apperçu que
je faisai fausse route .


"Patrice Scribe" a écrit dans le message de
news:%
Tu n'aurais pas des dates qui ne sont pas identiques ? Le code ci-dessous
semble ok...

create table T_Calendrier(Jour SMALLDATETIME)
CREATE TABLE T_Planning(Jour SMALLDATETIME,Qui VARCHAR(10))
GO
INSERT INTO T_Calendrier VALUES ('20040101')
INSERT INTO T_Calendrier VALUES ('20040102')
INSERT INTO T_Calendrier VALUES ('20040103')
INSERT INTO T_Calendrier VALUES ('20040104')

INSERT INTO T_Planning VALUES ('20040101','Moi')
INSERT INTO T_Planning VALUES ('20040103','Moi')
INSERT INTO T_Planning VALUES ('20040103','Elle')
INSERT INTO T_Planning VALUES ('20040103','Lui')
INSERT INTO T_Planning VALUES ('20040104','Eux')
GO
SELECT * FROM T_Calendrier
LEFT OUTER JOIN T_Planning ON T_Planning.Jour=T_Calendrier.Jour

me donne bien :

Jour Jour
Qui
------------------------------------------------------ -------------------


--
--------------------------------- ----------
2004-01-01 00:00:00 2004-01-01 00:00:00
Moi
2004-01-02 00:00:00 NULL
NULL
2004-01-03 00:00:00 2004-01-03 00:00:00
Moi
2004-01-03 00:00:00 2004-01-03 00:00:00
Elle
2004-01-03 00:00:00 2004-01-03 00:00:00
Lui
2004-01-04 00:00:00 2004-01-04 00:00:00
Eux

--

"Nicolas" a écrit dans le message de
news:
> Oui mais cette requete ne marche pas, j'ai deja essayé comme ca.
> Il ne prend pas en compte le left outer join, il le considere comme un
inner
> join
>
>
>
>
>
> "Patrice Scribe" a écrit dans le message de
> news:%
> > Tu peux ne joindre que sur la date ce qui te donnera tous les employés
> > concernés par une journée :
> >
> > SELECT *
> > FROM T_calendrier LEFT OUTER JOIN
> > T_T_Planning ON T_calendrier.dateJour > > > T_Planning.datePlanning
> > ORDER BY T_calendrier.dateJour,T_planning.nomEmployee
> >
> > Est-ce que tu veux ?
> >
> > --
> >
> > "Nicolas" a écrit dans le message de
> > news:
> > > Oui c'est exactement ce que j'ai fait, merci
> > > J'ai donc créé une table T_calendrier contenant tous les jours du


mois
> > > désiré et il m'a suffit de faire une jointure (left outter join)


avec
ma
> > > table T_Planning.
> > > Le seul hic est que dans ma table T_Planning les champs nomEmploye


et
> > > datePlanning sont tous les deux la clés primaires de ma table.
> > > Je suis donc obligé de faire ceci :
> > >
> > > SELECT *
> > > FROM T_calendrier LEFT OUTER JOIN
> > > T_T_Planning ON T_calendrier.dateJour > T_Planning
> > > .datePlanning AND T_Planning .nomEmploye = "Dupont"
> > > ORDER BY T_calendrier.dateJour
> > >
> > > Comment faire si je veux faire la même chose sur tout mes employés ?
> > >
> > > Merci
> > >
> > >
> > >
> > > "Patrice Scribe" a écrit dans le message de
> > > news:%
> > > > Généralement, on utilise dans ce cas une table "calendrier" qui
> contient
> > > > toutes les dates voulues et il ne reste qu'à faire la jointure...
> > > >
> > > > Patrice
> > > >
> > > > --
> > > >
> > > > "Nicolas" a écrit dans le message de
> > > > news:e%
> > > > > Bonjour tout le monde,
> > > > >
> > > > > J'ai une requête à faire qui me chagrinne un peu (beaucoup même


!)
> > > > > Voila disons que j'ai une table T_Planning, avec un champ
nomEmploye
> > et
> > > un
> > > > > champ datePlanning.
> > > > > T_Planning(nomEmploye,datePlanning)
> > > > > Dans cette table il ne peut y avoir que un enregistrement par


jour
> > pour
> > > un
> > > > > employé et c'est la que le bas blesse il peut que pour une date
> donnée
> > > > > l'employé n'est pas d'enregistrement.
> > > > > Or dans ma requete je vourdrais obtenir chaque jour du mois même
> ceux
> > > qui
> > > > > n'existe pas dans la table.
> > > > > Un exemple:
> > > > > Contenu de ma table :
> > > > >
> > > > > Dupont 01/02/2004
> > > > > Dupont 03/02/2004
> > > > > Dupont 08/02/2004
> > > > > Dupont 29/02/2004
> > > > >
> > > > > =>4 enregistrements pour le mois de février 2004 pour dupont
> > > > >
> > > > > Je voudrais obtenir avec ma requete le jeu d'enregistrement
suivant:
> > > > > Dupont 01/02/2004
> > > > > Dupont 02/02/2004
> > > > > Dupont 03/02/2004
> > > > > Dupont 04/02/2004
> > > > > Dupont 05/02/2004
> > > > > Dupont 06/02/2004
> > > > > Dupont 07/02/2004
> > > > > Dupont 08/02/2004
> > > > > ...
> > > > > Dupont 29/02/2004
> > > > >
> > > > > =>29 enregistrements pour le mois de février 2004 pour dupont
> > > > >
> > > > > Existe-il une astuce pour faire ceci ?????
> > > > > Merci de votre aide.
> > > > >
> > > > >
> > > > >
> > > >
> > >
> > >
> >
>
>



Avatar
Fred BROUARD
SELECT *
FROM T_calendrier C
LEFT OUTER JOIN T_Planning P
ON C.dateJour = P.datePlanning
WHERE P.nomEmployee = 'toto' OR P.nomEmployee IS NULL
ORDER BY C.dateJour, P.nomEmployee

A +

Nicolas a écrit:
Bonjour tout le monde,

J'ai une requête à faire qui me chagrinne un peu (beaucoup même !)
Voila disons que j'ai une table T_Planning, avec un champ nomEmploye et un
champ datePlanning.
T_Planning(nomEmploye,datePlanning)
Dans cette table il ne peut y avoir que un enregistrement par jour pour un
employé et c'est la que le bas blesse il peut que pour une date donnée
l'employé n'est pas d'enregistrement.
Or dans ma requete je vourdrais obtenir chaque jour du mois même ceux qui
n'existe pas dans la table.
Un exemple:
Contenu de ma table :

Dupont 01/02/2004
Dupont 03/02/2004
Dupont 08/02/2004
Dupont 29/02/2004

=>4 enregistrements pour le mois de février 2004 pour dupont

Je voudrais obtenir avec ma requete le jeu d'enregistrement suivant:
Dupont 01/02/2004
Dupont 02/02/2004
Dupont 03/02/2004
Dupont 04/02/2004
Dupont 05/02/2004
Dupont 06/02/2004
Dupont 07/02/2004
Dupont 08/02/2004
...
Dupont 29/02/2004

=>29 enregistrements pour le mois de février 2004 pour dupont

Existe-il une astuce pour faire ceci ?????
Merci de votre aide.






--
Frédéric BROUARD, MVP Microsoft SQL Server. Langage SQL / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************