J'essaie de faire une fonction de type instruction IF dans le serveur SQL.
Là où il y a un NULL dans le champ, je veux qu'il prenne un champ de l'une des tables et lui ajoute 10 jours.
Et si possible, créez une autre colonne et ajoutez les 30 jours.
SELECT DISTINCT
B.[ID],
MAX(A.[START DATE]),
B.[STAT],
C.[POST DATE],
CASE
WHEN (C.[POST DATE] BETWEEN C.[EVENT DATE]+10 AND C.[EVENT DATE]+30) THEN 'GOOD'
END AS [BETTER VISIT],
CASE
WHEN B.[STAT] IS NULL THEN (C.[EVENT DATE]+10)
ELSE '-'
END AS [DATE]
FROM
#TEMP1 A
FULL OUTER JOIN #TEMP2 B
ON A.[ID]=B.[ID]
FULL OUTER JOIN #TEMP3 C
ON A.[ID]=C.[ID]
GROUP BY
B.[ID],
B.[STAT],
C.[POST DATE],
C.[EVENT DATE]
ORDER BY
A.[START DATE] DESC
Le résultat ressemblerait un peu à:
ID START DATE STAT POST DATE BETTER VISIT DATE DATE2
---------------------------------------------------------------------------
1 2013-01-01 GOOD 2013-11-01 GOOD - -
2 2013-03-01 NULL NULL NULL 2013-03-11 2013-03-31
CASE WHEN B.[STAT] IS NULL THEN (C.[EVENT DATE]+10) -- Type DATETIME
ELSE '-' -- Type VARCHAR
END AS [DATE]
Vous devez sélectionner l'un ou l'autre type pour le champ, le type de champ ne peut pas varier par ligne. Le plus simple consiste à supprimer le ELSE '-'
et à le laisser implicitement obtenir la valeur NULL
à la place pour le second cas.
Je suis d'accord avec Joachim pour remplacer le trait d'union par NULL
. Mais si vous voulez vraiment un trait d'union, convertissez la date en chaîne:
(CASE WHEN B.[STAT] IS NULL
THEN convert(varchar(10), C.[EVENT DATE]+10, 121)
ELSE '-'
END) AS [DATE]
De plus, la distinct
n'est pas nécessaire dans votre instruction select
. Le group by
le fait déjà pour vous.
Vous pouvez utiliser IIF
(je pense de SQL Server 2012)
SELECT IIF(B.[STAT] IS NULL, C.[EVENT DATE]+10, '-') AS [DATE]
case isnull(B.[stat],0)
when 0 then dateadd(dd,10,(c.[Eventdate]))
end
vous pouvez ajouter une autre déclaration si vous souhaitez ajouter 30 jours à la même chose.
Dans cette situation, vous pouvez utiliser la fonction ISNULL () au lieu de l'expression CASE
ISNULL(B.[STAT], C.[EVENT DATE]+10) AS [DATE]
Votre trait d'union dans votre instruction ELSE n'est pas accepté dans la colonne en cours de définition sous le type de données datetime. Vous pouvez soit:
a) Enroulez un CAST autour de votre champ [stat] pour le convertir en une représentation varchar d’une date
b) Utilisez une date/heure telle que 9999-12-31 pour votre valeur ELSE.
Jetez un coup d'œil à la fonction ISNULL. Cela vous aide à remplacer les valeurs NULL par d'autres valeurs. http://msdn.Microsoft.com/en-us/library/ms184325.aspx