Djzlouk
Messages postés70Date d'inscriptionjeudi 26 juillet 2007StatutMembreDernière intervention20 janvier 2011
-
20 févr. 2009 à 14:29
cs_Malkuth
Messages postés268Date d'inscriptionsamedi 22 février 2003StatutMembreDernière intervention24 avril 2013
-
1 mars 2009 à 21:26
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
cs_Malkuth
Messages postés268Date d'inscriptionsamedi 22 février 2003StatutMembreDernière intervention24 avril 20134 1 mars 2009 à 21:26
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,
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...
ed73
Messages postés276Date d'inscriptionlundi 8 septembre 2008StatutMembreDernière intervention15 avril 20132 20 févr. 2009 à 15:58
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)