Good Morning All. J'ai lutté avec ce problème pendant un moment maintenant, et je ne peux pas sembler m'en passer la tête.Renvoyer des valeurs NULL en SQL si la table jointe ne contient pas d'enregistrements pour cette date
J'ai donc deux tables dans ma base de données
tblDateTrans
CREATE TABLE [dbo].[tblDateTrans](
[Date] [smalldatetime] NOT NULL,
)
Ce tableau est une table de calendrier externe qui contient toutes les dates de 1/1/2007 - 1/1/2011, il contient également des informations addtional comme informations de vacances, période de l'entreprise, etc. Mais ce n'est pas important pour cette question.
Ma deuxième table est
tblSurveySession
CREATE TABLE [dbo].[tblSurveySession](
[surveySessionID] [int] IDENTITY(1,1) NOT NULL,
[guestID] [int] NULL,
[surveyID] [int] NOT NULL,
[FK_StoreId] [int] NULL,
[surveyCompletedDate] [datetime] NULL
)
Ce tableau contient une liste des questionnaires envoyés et remplis par nos clients sur une période de temps. FK_StoreId est l'ID de l'unité de gestion de l'entreprise et surveyCompletedDate ne contient que des dates et aucune heure.
Mon but est de retourner une liste de surveySessionIDs et de dates en utilisant un LEFT OUTER JOIN sur la table tblDateTrans, je voudrais retourner toutes les dates sans tenir compte des valeurs. J'ai donc essayé d'exécuter cette requête:
SELECT tblDateTrans.Date, dbo.tblSurveySession.surveySessionID, dbo.tblSurveySession.FK_StoreId
FROM OPENQUERY([APOLLO], 'select Date FROM apollo.nhcglobal.dbo.tblDateTrans') AS tblDateTrans LEFT OUTER JOIN
dbo.tblSurveySession ON tblDateTrans.Date = dbo.tblSurveySession.surveyCompletedDate
WHERE (tblDateTrans.Date >= '1/1/2010') AND (tblDateTrans.Date <= '2/1/2010') AND (dbo.tblSurveySession.FK_StoreId = 4)
Mon retour des données ressemble à ceci:
Date surveySessionID FK_StoreId
2010-01-01 00:00:00.000 12702 4
2010-01-01 00:00:00.000 12736 4
2010-01-01 00:00:00.000 12456 4
2010-01-03 00:00:00.000 12662 4
2010-01-04 00:00:00.000 12660 4
2010-01-05 00:00:00.000 12510 4
2010-01-05 00:00:00.000 12889 4
2010-01-24 00:00:00.000 13751 4
2010-01-25 00:00:00.000 13793 4
2010-01-28 00:00:00.000 13958 4
2010-01-30 00:00:00.000 14059 4
2010-01-31 00:00:00.000 14139 4
Mon but est d'avoir la requête renvoie les données comme ceci:
Date surveySessionID FK_StoreId
2010-01-01 00:00:00.000 12702 4
2010-01-01 00:00:00.000 12736 4
2010-01-01 00:00:00.000 12456 4
2010-01-02 00:00:00.000 NULL NULL
2010-01-03 00:00:00.000 12662 4
2010-01-04 00:00:00.000 12660 4
2010-01-05 00:00:00.000 12510 4
2010-01-05 00:00:00.000 12889 4
2010-01-06 00:00:00.000 NULL NULL
2010-01-07 00:00:00.000 NULL NULL
2010-01-08 00:00:00.000 NULL NULL
2010-01-09 00:00:00.000 NULL NULL
2010-01-10 00:00:00.000 NULL NULL
2010-01-11 00:00:00.000 NULL NULL
2010-01-12 00:00:00.000 NULL NULL
2010-01-13 00:00:00.000 NULL NULL
2010-01-14 00:00:00.000 NULL NULL
2010-01-15 00:00:00.000 NULL NULL
2010-01-16 00:00:00.000 NULL NULL
2010-01-17 00:00:00.000 NULL NULL
2010-01-18 00:00:00.000 NULL NULL
2010-01-19 00:00:00.000 NULL NULL
2010-01-20 00:00:00.000 NULL NULL
2010-01-21 00:00:00.000 NULL NULL
2010-01-22 00:00:00.000 NULL NULL
2010-01-23 00:00:00.000 NULL NULL
2010-01-24 00:00:00.000 13751 4
2010-01-25 00:00:00.000 13793 4
2010-01-28 00:00:00.000 13958 4
2010-01-30 00:00:00.000 14059 4
2010-01-31 00:00:00.000 14139 4
I figuré une LEFT OUTER JOIN forcerait la requête à regarder toutes les dates et retourner NULLS sur les jours qui manquent surveySessionIDs et FK_StoreIds. Nous avons déjà rencontré ce genre de problème avec d'autres projets, ce qui nous aiderait énormément dans le futur. Merci à tous pour votre aide!
Je sais que ce n'est pas lié mais ce n'est pas le matin ici, ce site est assez international. :) – stckvrflw
Comme les questions restent apparemment disponibles pour être affichées sur ce site indéfiniment, peu importe où dans le monde l'affiche est: Dans quelques heures, le poste sera toujours là, mais ce ne sera pas le matin pour lui non plus . – Jay