2016-05-17 9 views
3

Ich bin mir nicht sicher, was ich mache, um das falsch zu machen. Ich versuche, die Anzahl von usertb.id pro Monat zu erhalten. Ich möchte, dass die 0s angezeigt werden, wenn die Anzahl null ist. Ich verwende einen linken äußeren Join mit einer Monatstabelle, die nur die ID des Monats und den Namen des Monats enthält. Bitte helfen Sie. Ich bin mit SQL Server 2008Kann Nullwerte für die Zählung pro Monat nicht erhalten

SELECT 
    monthTB.name 
    ,subTB.name 
    ,COUNT(userTB.ID) 
FROM TDP_NetOps.dbo.sub_activity AS subTB 
    ,TDP_NetOps.dbo.month AS monthTB 
    LEFT OUTER JOIN TDP_NetOps.dbo.user_sub_activity AS userTB ON monthTB.ID = DATEPART(month, userTB.date_of_activity) 
WHERE 
    subTB.sub_activity_id = userTB.sub_activity_id 
    AND userTB.emp_id = 'xxxx' 
GROUP BY 
     monthTB.name 
     ,monthTB.ID 
     ,subTB.name 
ORDER BY 
     monthTB.ID ASC 
     ,subTB.name ASC 
+2

* Niemals * Kommas in der 'FROM' Klausel. * Verwenden Sie immer explizite 'JOIN'-Syntax. –

Antwort

2

Nun, es gibt ein paar Dinge falsch mit Ihrer Suchanfrage:

Erstens keine implizite JOIN Syntax verwenden (durch Komma getrennt), verwenden Sie die richtige Syntax von beizutreten.

Zweitens, wenn Sie sie verwenden, mischen Sie sie nicht zusammen mit der expliziten Syntax, es wird immer zu Fehlern führen.

Und schließlich Bedingungen auf der rechten Tabelle eines LEFT JOIN innerhalb der ON Klausel sein sollte, wenn sie in dem, wo angegeben, die Join verwandelt sich in eine innere Verknüpfung. :

SELECT monthTB.name 
    , subTB.name 
    , COUNT(userTB.ID) 
FROM TDP_NetOps.dbo.sub_activity AS subTB 
CROSS JOIN TDP_NetOps.dbo.month AS monthTB 
LEFT OUTER JOIN TDP_NetOps.dbo.user_sub_activity AS userTB 
ON (monthTB.ID = DATEPART(month, userTB.date_of_activity) 
    AND subTB.sub_activity_id = userTB.sub_activity_id 
    AND userTB.emp_id = 'xxxx') 
GROUP BY monthTB.name 
     , monthTB.ID 
     , subTB.name 
ORDER BY monthTB.ID ASC 
     , subTB.name ASC 
+0

Vielen Dank sagi. Ich bin ziemlich neu in SQL, und ich versuche immer noch zu lernen. Danke für die Hinweise, ich werde schauen, was du gesagt hast. – user2997109

0

Ihre WHERE Klausel Lösen der LEFT JOIN. Ich denke, das ist die Logik, die Sie wollen:

SELECT monthTB.name, subTB.name 
     COUNT(userTB.ID) 
FROM (SELECT DISTINCT subTB.sub_activity_id 
     FROM TDP_NetOps.dbo.sub_activity subTB 
     WHERE subTB.emp_id = 'xxxx' 
    ) subTB CROSS JOIN 
    TDP_NetOps.dbo.month AS monthTB LEFT OUTER JOIN 
    TDP_NetOps.dbo.user_sub_activity userTB 
    ON monthTB.ID = DATEPART(month, userTB.date_of_activity) AND 
     subTB.sub_activity_id = userTB.sub_activity_id AND 
     subTB.emp_id = 'xxxx' 
GROUP BY monthTB.name, monthTB.ID, subTB.name 
ORDER BY monthTB.ID ASC, subTB.name ASC; 

Ich bin mir nicht sicher, ob der zweite Filter auf emp_id wirklich benötigt wird. Das hängt davon ab, wie die Daten aussehen.

-1
SELECT monthTB.name 
    , subTB.name 
    , COALESCE(COUNT(userTB.ID),0) 
FROM TDP_NetOps.dbo.sub_activity AS subTB 
    , TDP_NetOps.dbo.month AS monthTB 
LEFT OUTER JOIN TDP_NetOps.dbo.user_sub_activity AS userTB ON monthTB.ID = DATEPART(month, userTB.date_of_activity) 
WHERE subTB.sub_activity_id = userTB.sub_activity_id 
    AND userTB.emp_id = 'xxxx' 
GROUP BY monthTB.name 
     , monthTB.ID 
     , subTB.name 
ORDER BY monthTB.ID ASC 
     , subTB.name ASC 
+0

Wird immer noch das Gleiche tun! – sagi

+0

es funktioniert nicht. Die Nullwerte werden nicht angezeigt. – user2997109

+0

Können Sie Beispieldaten in temporären Tabellen bereitstellen. Es wäre einfach zu testen. –

Verwandte Themen