SQL JOIN ne montrant pas les résultats NULL lorsque la clause WHERE est utilisée

Serveur: SQL Server 2008 R2
SQL Fiddle: http://sqlfiddle.com/#!6/112a6/4/0

Je m'excuse pour le pauvre sujet / titre, mais j'ai du mal à verbaliser comment exprimer mon problème, donc je vais le dessiner avec un exemple (probablement) long:

Voici une requête plutôt simple qui obtient le nombre de sessions pour un PC pour une certaine plage de dates. Notez à ce stade que la clause WHERE est mise en commentaire. Ce que j'espère recevoir est la list complète des PC, même ceux qui ont des sessions ZERO / NULL durant cette période. Cependant, quand j'ajoute cette clause WHERE, j'obtiens UNIQUEMENT les PC qui ont eu des sessions pendant cette période. Ceci est problématique parce que je ne peux pas voir les ordinateurs inutilisés pendant cette période.

SELECT f_assetnetbiosname, COUNT(f_sessiondate) as 'Sessions' FROM tb_assets ass LEFT JOIN tb_sessions ses ON ses.f_sessionnetbiosname = ass.f_assetnetbiosname --WHERE (f_sessiondate BETWEEN '04/01/2015' AND '04/30/2015') GROUP BY f_assetnetbiosname ======================== =======================================| | tb_assets | | tb_sessions | ======================== =======================================| | f_assetnetbiosname | | f_sessionnetbiosname f_sessiondate | ------------------------ ---------------------------------------| | COMP_001 | | COMP_002 03/29/2015 | | COMP_002 | | COMP_002 03/30/2015 | | COMP_003 | | COMP_001 03/30/2015 | ------------------------ | COMP_001 04/02/2015 | | COMP_001 04/03/2015 | | COMP_001 04/04/2015 | | COMP_001 04/05/2015 | ----------------------------------- 

La requête basée sur ces résultats renvoie l'set de résultats suivant:

 |=================================| | f_assetnetbiosname | Sessions | |=================================| | COMP_001 | 5 | | COMP_002 | 2 | | COMP_003 | 0 | |=================================| 

Le problème est que je n'ai besoin de searchr qu'une plage de dates. Donc, si je décommode la clause "WHERE" dans la requête ci-dessus, le jeu de résultats ressemble seulement à ce qui suit:

 |=================================| | f_assetnetbiosname | Sessions | |=================================| | COMP_001 | 4 | |=================================| 

Mais j'ai besoin de ressembler à ce qui suit pour que je puisse voir les PC qui n'avaient aucune session:

 |=================================| | f_assetnetbiosname | Sessions | |=================================| | COMP_001 | 4 | | COMP_002 | 0 | | COMP_003 | 0 | |=================================| 

Est-ce que quelqu'un a une solution pour cela? Notez que l'exemple ci-dessus est juste que – un exemple. La vraie requête est un bearcat multi-CTE mais je me suis dit qu'il valait mieux le réduire aux bases pour ne pas brouiller la conversation en montrant mon mauvais code.

SQL Fiddle : http://sqlfiddle.com/#!6/112a6/4/0

Merci d'avance,
Beems

Vous pouvez l'append à la clause Join :

 SELECT f_assetnetbiosname, COUNT(f_sessiondate) as 'Sessions' FROM tb_assets ass LEFT OUTER JOIN tb_sessions ses ON ses.f_sessionnetbiosname = ass.f_assetnetbiosname AND f_sessiondate BETWEEN '04/01/2015' AND '04/30/2015' GROUP BY f_assetnetbiosname 

Voici une démo: http://sqlfiddle.com/#!6/112a6/23/0

C'est la différence d'une Join clause et d'un qui est également mentionné ici .

Il semble que vous ayez seulement besoin de countr en fonction d'une date pour pouvoir mettre la condition dans votre count.

 SELECT f_assetnetbiosname, COUNT(CASE WHEN (f_sessiondate BETWEEN '04/01/2015' AND '04/30/2015') THEN 1 ELSE null END) as 'Sessions' FROM tb_assets ass LEFT JOIN tb_sessions ses ON ses.f_sessionnetbiosname = ass.f_assetnetbiosname GROUP BY f_assetnetbiosname 

http://sqlfiddle.com/#!6/112a6/27