T-SQL – Effectuer une jointure pour récupérer les comptages de 0

Je travaille avec une database climatiques qui a trois tables. Table d'events contenant la date et l'heure auxquelles un événement météorologique a eu lieu, le type d'événement et l'état dans lequel l'événement s'est produit. La deuxième table est une table d'events de fatalité liée par un numéro d'identification de la première table. Enfin, il y a un tableau qui contient une list d'années (1950, 1951, 1952 etc.).

J'ai écrit ce qui suit: –

SELECT State, YEAR(BeginDate) as Year, COUNT(*) as CountOfEvents FROM [StormEvents].[dbo].[DT_Event] JOIN [StormEvents].[dbo].[DT_FatalityEvent] ON [StormEvents].[dbo].[DT_Event].EventID = [StormEvents].[dbo].[DT_FatalityEvent].EventID WHERE EventType like'%tornado%' AND YEAR(BeginDate) >= 1995 AND YEAR(BeginDate) <= 2014 GROUP BY State, YEAR(BeginDate) ORDER BY State, YEAR(BeginDate) 

qui résume le nombre d'accidents mortels par mois et par état. La requête ci-dessus fonctionne mais elle omet tous les counts qui returnnent un nombre de 0.

J'ai essayé d'append cette ligne après avoir lu sur les jointures: –

 RIGHT JOIN [StormEvents].[dbo].[DT_YearValues] ON YEAR([StormEvents].[dbo].[DT_Event].BeginDate) = [StormEvents].[dbo].[DT_YearValues].[Year] 

mais ceci ne returnne pas de 0 dans les champs où le nombre d'events mortels pour cet état et cette année est 0.

Quelqu'un peut-il suggérer où je vais mal?

Merci!

En supposant que EventType est dans [StormEvents]. [Dbo]. [DT_FatalityEvent]
ce qui suit casserait une bonne jointure
où EventType like '% tornado%'

 SELECT State, YEAR(BeginDate) as Year, COUNT([StormEvents].[dbo].[DT_FatalityEvent].[EventID]) as CountOfEvents FROM [StormEvents].[dbo].[DT_Event] right JOIN [StormEvents].[dbo].[DT_FatalityEvent] ON [StormEvents].[dbo].[DT_Event].[EventID] = [StormEvents].[dbo].[DT_FatalityEvent].[EventID] and EventType like'%tornado%' AND YEAR(BeginDate) >= 1995 AND YEAR(BeginDate) <= 2014 GROUP BY State, YEAR(BeginDate) ORDER BY State, YEAR(BeginDate) 

Vous devez identifier de quelle table proviennent les colonnes

Je pense que vous avez besoin d'une jointure à gauche. Si votre table DT_FatalityEvent n'a que des loggings pour les events de fatalité, vous effectuez une jointure interne, et il devrait probablement s'agir d'une jointure à gauche comme expliqué ici

Voici un exemple de comment je coderais la requête. (NOTE: j'alias habituellement les tables afin qu'il soit plus facile de savoir à qui vous faites reference dans la clause SELECT ).

Je suppose également que vous avez un NumberOfFatalities pour chaque événement, auquel cas vous pourriez envisager un SUM place.

 SELECT A.State, YEAR(A.BeginDate) [Year], SUM(ISNULL(B.NumberOfFatalities,0)) [Fatalities] FROM DT_Event A LEFT JOIN DT_FatalityEvent B ON A.EventId = B.EventID WHERE A.EventType like'%tornado%' AND YEAR(A.BeginDate) >= 1995 AND YEAR(A.BeginDate) <= 2014 GROUP BY A.State, YEAR(A.BeginDate) ORDER BY A.State, YEAR(A.BeginDate) 

Cela vous assurera que vous obtenez des loggings de la table DT_Event même s'il n'y a pas d'loggings DT_FatalityEvent avec des ID d'événement correspondants. Le champ NumberOfFatalities (ma conjecture) serait NULL dans ces cas, donc vous devriez probablement assurer une valeur de 0 avant d'utiliser le SUM .

Merci beaucoup pour la réponse rapide. Je vais certainement prendre en count ce qui a été dit par Blam à propos de l'utilisation d'alias car cela rend le code beaucoup plus facile, donc merci pour le conseil. Je le rendais trop complexe, et en effet, comme bigtlb a dit qu'il n'y avait pas besoin d'une table YearValues.

C'était le code qui a fait ce dont j'avais besoin!

 SELECT A.State, YEAR(A.BeginDate), COUNT(B.EventID) FROM [StormEvents].[dbo].[DT_Event] A LEFT JOIN [StormEvents].[dbo].[DT_FatalityEvent] B ON A.EventID = B.EventID AND A.EventType like '%tornado%' GROUP BY State, YEAR(A.BeginDate) ORDER BY State, YEAR(A.BeginDate) 

Merci pour les suggestions de tous! Mike.