Grouper et returnner zéro si aucun logging n'est trouvé

Je sais qu'il y a différents sujets sur ce sujet.

J'essaye de créer une requête qui returnne un tâtonnement prédéfini d'loggings et s'il n'y a aucun résultat trouvé je voudrais renvoyer zéro. La plupart des threads suggèrent de créer une table temporaire pour héberger ces données de regroupement, mais je devrai le faire dans une seule déclaration. Cependant, nous pouvons utiliser des sous-requêtes.


C'était mon code original …

et renvoie les valeurs correctes mais ne contient pas les groupes qui n'ont pas de tickets:

SELECT SC.Service_Company_Code , SSPM.Mapping , COUNT(T.Service_Ticket_Id) AS 'Ticket_Count' FROM SV_Service_Ticket T INNER JOIN KS_SedonaSync_Problem SSP ON T.Sub_Problem_Id = SSP.Problem_Id RIGHT JOIN KS_SedonaSync_Problem_Sub_Mapping SSPM ON SSP.SedonaSync_Problem_Sub_Mapping_Id = SSPM.SedonaSync_Problem_Sub_Mapping_Id RIGHT JOIN SV_Service_Company SC ON T.Service_Company_Id = SC.Service_Company_Id WHERE SC.Vendor_Id = 1 AND SC.Inactive = 'N' AND SC.Service_Company_Id <> 1 AND SSPM.Inactive = 'N' AND T.Ticket_Status <> 'CL' GROUP BY SC.Service_Company_Code, SSPM.Mapping ORDER BY SC.Service_Company_Code, SSPM.Mapping 

Mon code révisé …

contient maintenant une sous-requête qui affiche les regroupements corrects et s'exécute seule sans lien dans la table Ticket. Mais encore une fois lorsqu'il est lié à la table des tickets, il ne montre pas le groupement lorsqu'il n'y a pas d'loggings présents. L'utilisation de la jointure gauche est censée me montrer des loggings NULL quand ils n'existent pas.

 SELECT Q.Service_Company_Code , Q.Mapping , COUNT(T.Service_Ticket_Id) AS 'Ticket_Count' FROM (SELECT SC.Service_Company_Id, SC.Service_Company_Code, SSP.Problem_Id, SSPM.SedonaSync_Problem_Sub_Mapping_Id, SSPM.Mapping FROM SV_Service_Company SC FULL OUTER JOIN KS_SedonaSync_Problem_Sub_Mapping SSPM ON 1=1 LEFT JOIN KS_SedonaSync_Problem SSP ON SSPM.SedonaSync_Problem_Sub_Mapping_Id = SSP.SedonaSync_Problem_Sub_Mapping_Id WHERE SC.Vendor_Id = 1 AND SC.Inactive = 'N' AND SC.Service_Company_Id <> 1 AND SSPM.Inactive = 'N' ) Q LEFT JOIN SV_Service_Ticket T ON T.Sub_Problem_Id = Q.Problem_Id AND T.Service_Company_Id = Q.Service_Company_Id WHERE T.Ticket_Status <> 'CL' GROUP BY Q.Service_Company_Code, Q.Mapping ORDER BY Q.Service_Company_Code, Q.Mapping 

Toute aide est grandement appréciée, merci d'avance.

Brad Swindell

EDIT: Ceci est le jeu de résultats actuel.

entrez la description de l'image ici

C'est l'set de résultats souhaité.

entrez la description de l'image ici

EDIT: J'ai trouvé une solution de travail grâce à Mike M!

 SELECT SC.Service_Company_Code , SSPM.Mapping , COUNT(T.Service_Ticket_Id) AS 'Ticket_Count' FROM SV_Service_Company SC CROSS JOIN KS_SedonaSync_Problem SSP INNER JOIN KS_SedonaSync_Problem_Sub_Mapping SSPM ON SSP.SedonaSync_Problem_Sub_Mapping_Id = SSPM.SedonaSync_Problem_Sub_Mapping_Id AND SC.Vendor_Id = 1 AND SC.Inactive = 'N' AND SC.Service_Company_Id <> 1 LEFT JOIN SV_Service_Ticket T ON T.Sub_Problem_Id = SSP.Problem_Id AND T.Service_Company_Id = SC.Service_Company_Id AND T.Ticket_Status <> 'CL' WHERE SSPM.Inactive = 'N' GROUP BY SC.Service_Company_Code, SSPM.Mapping ORDER BY SC.Service_Company_Code, SSPM.Mapping 

Avez-vous essayé de déplacer ce dernier bit dans la clause WHERE dans les critères de jointure? NULL n'a pas = ou <> rien 🙂

Alors

 T.Ticket_Status <> 'CL' 

est probablement incapable de tirer les lignes qui ont la valeur NULL.

Ajoutez "et T.Ticket_Status <> 'CL'" comme un élément de plus dans vos critères de jointure, pour avoir

  LEFT JOIN SV_Service_Ticket T ON T.Sub_Problem_Id = Q.Problem_Id AND T.Service_Company_Id = Q.Service_Company_Id and T.Ticket_Status <> 'CL' 



Donc, vous voyez d'où nous venons, voici le cas de base que nous (et vous) voulez arriver. Êtes-vous sûr que la sous-requête est établie?

 if object_id('tempdb..#tempItems') is not null drop table #tempItems; create table #tempItems ( id int primary key , category varchar(100) , subCategory varchar(100) ) ; insert into #tempItems (id, category, subCategory) values (1, 'First', 'subA'); insert into #tempItems (id, category, subCategory) values (2, 'First', 'subB'); insert into #tempItems (id, category, subCategory) values (3, 'Second', 'subA'); insert into #tempItems (id, category, subCategory) values (4, 'NotFound', 'subNotFound'); --------------------------------------------------------- if object_id('tempdb..#tempCounts') is not null drop table #tempCounts; create table #tempCounts ( id int primary key , itemId int ) ; insert into #tempCounts (id, itemId) values (1, 1); insert into #tempCounts (id, itemId) values (2, 2); insert into #tempCounts (id, itemId) values (3, 3); insert into #tempCounts (id, itemId) values (4, 3); ---------------------------------------------------------- select items.category ,items.subcategory , count(counts.id) as count from #tempItems items left join #tempCounts counts on items.id = counts.itemid group by items.category, items.subcategory order by items.category, items.subcategory 

Je ne sais pas si cela fonctionnera, mais essayez-le, car aucune donnée n'est disponible, c'est donc un peu difficile de voir exactement ce qui se passe. de toute façon, essayez-le.

 SELECT SC.Service_Company_Code , SSPM.Mapping , COUNT(T.Service_Ticket_Id) AS [Ticket_Count] FROM KS_SedonaSync_Problem SSP RIGHT JOIN SV_Service_Ticket T ON T.Sub_Problem_Id = SSP.Problem_Id RIGHT JOIN KS_SedonaSync_Problem_Sub_Mapping SSPM ON SSP.SedonaSync_Problem_Sub_Mapping_Id = SSPM.SedonaSync_Problem_Sub_Mapping_Id RIGHT JOIN SV_Service_Company SC ON T.Service_Company_Id = SC.Service_Company_Id WHERE SC.Vendor_Id = 1 AND SC.Inactive = 'N' AND SC.Service_Company_Id <> 1 AND SSPM.Inactive = 'N' AND T.Ticket_Status <> 'CL' GROUP BY SC.Service_Company_Code, SSPM.Mapping ORDER BY SC.Service_Company_Code, SSPM.Mapping 

Si je lis correctement votre SQL, je pense que vous avez juste besoin de déplacer votre condition vers le LEFT JOIN . Si cela ne produit pas les résultats souhaités, pourriez-vous mettre en place un Fiddle SQL?

 SELECT Q.Service_Company_Code , Q.Mapping , COUNT(T.Service_Ticket_Id) AS 'Ticket_Count' FROM ( SELECT SC.Service_Company_Id, SC.Service_Company_Code, SSP.Problem_Id, SSPM.SedonaSync_Problem_Sub_Mapping_Id, SSPM.Mapping FROM SV_Service_Company SC CROSS JOIN KS_SedonaSync_Problem_Sub_Mapping SSPM LEFT JOIN KS_SedonaSync_Problem SSP ON SSPM.SedonaSync_Problem_Sub_Mapping_Id = SSP.SedonaSync_Problem_Sub_Mapping_Id WHERE SC.Vendor_Id = 1 AND SC.Inactive = 'N' AND SC.Service_Company_Id <> 1 AND SSPM.Inactive = 'N' ) Q LEFT JOIN SV_Service_Ticket T ON T.Sub_Problem_Id = Q.Problem_Id AND T.Service_Company_Id = Q.Service_Company_Id AND T.Ticket_Status <> 'CL' GROUP BY Q.Service_Company_Code, Q.Mapping ORDER BY Q.Service_Company_Code, Q.Mapping