Select avec résultat induit

Résolu
Signaler
Messages postés
70
Date d'inscription
jeudi 26 juillet 2007
Statut
Membre
Dernière intervention
20 janvier 2011
-
Messages postés
268
Date d'inscription
samedi 22 février 2003
Statut
Membre
Dernière intervention
24 avril 2013
-
Bonjour les SQLeux :)

J'ai un petit souci avec 2 tables. Je vous explique.

Table Prevu :
Id
User
Temps

Table Realise :
Id
User
Temps

J'ai aussi des liens :
Prevu.Id = Realise.Id
Prevu.User = Realise.Id

Dans ma table Prevu j'ai 444 enregistrements et dans ma table Realise j'ai 148 enregistrements.

En réalité, dans ma table Prevu, je renseigne tout ce que je prévois de travailler et dans ma table realise c'est ce que j'ai réellement pointé. C'est pour cela que j'ai moins d'enregistrement dans la table realise.

Ma problématique est simple, je veux connaitre ma charge, donc (Prevu.Temps - Realise.Temps) = Charge.

Ce que j'ai fait c'est :
SELECT (Prevu.Temps - Realise.Temps) AS Charge
FROM Prevu JOIN Realise
WHERE Prevu.Id = Realise.Id AND

Prevu.User = Realise.Id

Mais cela me retourne que 148 resultats, alors que si le realise n'existe pas encore j'aimerais que le temps soit à 0 et donc que cela affiche que le Prevu.temps en face de l'Id et du User

Quelqu'un a t il une idée ?

Merchi :)

3 réponses

Messages postés
268
Date d'inscription
samedi 22 février 2003
Statut
Membre
Dernière intervention
24 avril 2013
3
un truc aussi, je ne connait pas toute ta base de donné mais je vois pas l'intéret des 2 table,

tu pourais faire
Table Travail :
Id
User
TempsPrevus
Fait (type booleen)
TempsReel

voir même, tu fais

Table Travail :
Id
User
TempsPrevu
TempsReel

en autorisant Null dans la colone TempsReel et si temps Réel = NULL alors c'est que le travaille n'est pas fait mais bon concernant l'indexation se seras sans doute plus efficace de prendre la premiére solution, ce qui donnerais la requette suivante sur SQLServeur

SELECT (TempsPrevu - CASE Fait WHEN 1 THEN TempsReel ELSE 0 END) AS Charge FROM Travaille

Et si cette requette est utiliser souvent tu fais même un champ calculer

Table  Travail :
Id
User
TempsPrevu
Fait (type booleen)
TempsReel
Charge (TempsPrevu - CASE Fait WHEN 1 THEN TempsReel ELSE 0 END)

ca donne la définition de table suivante :


CREATE
TABLE [dbo]
.[Travail]
(
   [Id] [int]
NOT
NULL,
   [User] [int]
NOT
NULL,
   [TempsPrevu] [int]
NOT
NULL,
   [Fait] [bit]
NOT
NULL,
   [TempsReel] [int]
NOT
NULL 
CONSTRAINT [DF_Travail_TempsReel]
DEFAULT
((0
)),
   [Charge]
AS
([TempsPrevu]
-case [Fait]
when
(1
)
then [TempsReel]
else
(0
)
end) PERSISTED,

   CONSTRAINT [PK_Travail]
PRIMARY
KEY
CLUSTERED
( [Id]
ASC
)
   WITH
(PAD_INDEX
=
OFF,
STATISTICS_NORECOMPUTE
=
OFF,
IGNORE_DUP_KEY
=
OFF,
ALLOW_ROW_LOCKS
=
ON,
ALLOW_PAGE_LOCKS
=
ON)

)


Le mot clef Persisted indique au moteur de calculer la valeur de Charge lors de la modifications de Fais/TempsReel/TempsPrevu plutot qu'au moment de la selection, vu que ces champs ne sont sans doute pas modifier trés souvent sa te fais gagner pas mal en performance.

aprés tu fais un select tout se qu'il y'a de plus banal :

SELECT Charge FROM Travail ^^ et en plus tu peus indexé Charge si t'en as besion dans des condition de requette (genre voir les traveaux dont la charge dépasse 100...
Messages postés
276
Date d'inscription
lundi 8 septembre 2008
Statut
Membre
Dernière intervention
15 avril 2013
2
En SQL Server ça pourrait être

SELECT Prevu.Id, Prevu.User,
CASE WHEN  Realise.Temps is not null
Prevu.Temps - Realise.Temps
ELSE Prevu.Temps END
AS Charge
FROM Prevu LEFT OUTER JOIN Realise ON (Prevu.Id = Realise.Id AND
Prevu.User = Realise.Id)

En Access

SELECT Prevu.Id, Prevu.User,
IIF(Realise.Temps is not null,Prevu.Temps - Realise.Temps,Prevu.Temps)
AS Charge
FROM Prevu LEFT OUTER JOIN Realise ON (Prevu.Id = Realise.Id AND
Prevu.User = Realise.Id)
Messages postés
276
Date d'inscription
lundi 8 septembre 2008
Statut
Membre
Dernière intervention
15 avril 2013
2
Il y a aussi un truc qui ne va pas dans ta requête, la jointure devrait être :
(Prevu.Id Realise.Id AND Prevu.User Realise.User)