如何在组查询中返回零值

1 sql-server group-by

我有这个查询:

    SELECT fksiteID, SUM(SearchTypePerson) + 
       SUM(SearchTypeLocker) + 
       SUM(SearchTypeSpotRandom) + 
       SUM(SearchTypePersVehicle) + 
       SUM(SearchTypeVisitorContractorVehicle) + 
       SUM(SearchTypeCompanyVehicle) + 
       SUM(SearchTypeToilet) + 
       SUM(PatrolExternal) + 
       SUM(PatrolCarPark) + 
       SUM(PatrolPerimeter) + 
       SUM(PatrolInternal) + 
       SUM(VehicleCheckAmbientLine) + 
       SUM(VehicleCheckFridgeLine) + 
       SUM(VehicleCheckSealChecks) + 
       SUM(OtherChecksIDCards) + 
       SUM(OtherChecksIncidentReports) + 
       SUM(OtherChecksColdStoreChecks) AS NumChecks
  FROM [AIP].[dbo].[AAHOfficerDailyActivityReport]
  WHERE MonthOfReport = 6 AND RecordIsDeletedYN = 0 AND fkSiteID in (945,947,948,949,950,951,952)
  GROUP BY fkSiteID
Run Code Online (Sandbox Code Playgroud)

这给出了这个结果:

fksiteID    NumChecks
945         228
947         27
949         58
951         67
952         1015
Run Code Online (Sandbox Code Playgroud)

但是我希望它返回:

fksiteID    NumChecks
945         228
947         27
948         0
949         58
950         0
951         67
952         1015
Run Code Online (Sandbox Code Playgroud)

此查询的结果将为饼图提供数据,该饼图将显示每个站点完成的检查次数的细分,我需要将未完成检查的站点显示为零条目。

这是 AAHOfficerDailyActivityReport 表的原始数据:

AAHOfficerDailyActivityReportID fkUserID    fkSiteID    ShiftType   DateOfReport    MonthOfReport   SearchTypePerson    SearchTypeLocker    SearchTypeSpotRandom    SearchTypePersVehicle   SearchTypeVisitorContractorVehicle  SearchTypeCompanyVehicle    SearchTypeToilet    PatrolExternal  PatrolCarPark   PatrolPerimeter PatrolInternal  VehicleCheckAmbientLine VehicleCheckFridgeLine  VehicleCheckSealChecks  OtherChecksIDCards  OtherChecksIncidentReports  OtherChecksColdStoreChecks  RecordIsDeletedYN
1   1   945 Day 2019-05-18 00:00:00.000 5   3   3   3   3   3   3   3   4   4   4   4   2   2   2   5   5   5   0
2   1   948 Day 2019-05-17 01:30:00.000 5   3   3   3   3   3   3   3   4   4   4   4   2   2   2   5   5   5   0
3   476 945 Day 2019-05-20 00:00:00.000 5   8   0   0   0   0   8   0   0   0   0   0   0   0   0   150 2   0   1
4   476 951 Day 2019-05-31 00:00:00.000 5   0   0   0   0   0   0   0   0   2   0   0   2   0   2   3   0   24  0
5   428 952 Day 2019-06-01 00:00:00.000 6   3   3   0   0   0   0   3   3   3   3   0   0   0   0   0   0   0   0
6   450 951 Night   2019-05-31 00:00:00.000 5   1   0   0   1   0   0   0   0   0   0   0   1   0   0   0   0   24  0
7   479 947 Night   2019-05-31 06:10:06.070 5   0   0   0   7   0   0   0   0   0   0   0   0   0   0   8   0   0   0
8   450 0   Day 2019-06-01 00:00:00.000 6   1   0   0   0   0   0   0   0   0   0   0   0   0   0   3   0   24  0
9   450 951 Day 2019-06-02 04:45:00.000 6   1   0   0   0   0   0   0   0   0   0   0   0   0   0   3   0   24  0
10  459 952 Day 2019-06-02 00:00:00.000 6   0   2   0   0   0   0   2   2   2   2   0   0   0   0   0   0   0   1
11  459 952 Day 2019-06-02 15:15:00.000 6   56  2   0   0   0   0   2   2   2   2   0   0   0   0   0   0   0   1
12  459 952 Day 2019-06-02 15:15:00.000 6   56  2   0   0   0   0   2   2   2   2   0   0   0   0   0   0   0   1
13  459 952 Day 2019-06-02 15:15:00.000 6   0   2   0   0   0   0   2   2   2   2   0   0   0   0   0   0   0   1
14  459 0   Day 2019-06-02 15:22:43.553 6   0   2   0   0   0   0   2   2   2   2   0   0   0   0   0   0   0   0
15  459 952 Day 2019-06-02 15:26:00.000 6   0   2   0   0   0   0   2   2   2   2   0   0   0   0   0   0   0   1
16  459 952 Day 2019-06-03 00:00:00.000 6   120 2   0   0   0   0   3   3   0   0   0   0   0   0   18  0   0   0
17  459 952 Day 2019-06-03 14:31:00.000 6   120 2   0   0   0   0   3   3   0   0   0   0   0   0   18  0   0   1
18  535 952 Day 2019-06-03 15:42:12.380 6   55  3   0   0   0   10  3   3   3   3   0   0   0   0   18  0   0   0
19  541 952 Day 2019-06-03 15:44:34.177 6   55  3   0   0   0   10  3   3   3   3   0   0   0   0   18  0   0   0
20  459 952 Day 2019-06-03 00:00:00.000 6   120 0   0   0   0   0   0   0   0   0   0   0   0   0   36  0   0   0
21  479 947 Night   2019-06-02 06:11:00.000 6   0   0   0   0   0   0   0   3   1   0   0   0   0   0   0   0   0   0
22  428 952 Night   2019-06-04 00:00:00.000 6   2   4   0   0   0   0   4   4   4   4   0   0   0   0   0   0   0   0
23  479 947 Night   2019-06-03 00:00:00.000 6   0   0   0   7   0   0   0   0   1   0   0   0   0   0   9   0   0   1
24  438 945 Day 2019-06-04 00:00:00.000 6   7   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
25  476 947 Day 2019-06-03 09:27:00.000 6   0   0   0   0   0   10  0   0   0   0   0   0   0   0   4   0   0   1
26  476 947 Day 2019-06-03 09:27:00.000 6   7   0   0   0   0   10  0   0   0   0   0   0   0   0   4   0   0   1
27  535 952 Day 2019-06-04 00:00:00.000 6   70  3   0   0   0   10  3   3   3   3   0   0   0   0   18  0   0   0
28  541 952 Day 2019-06-04 00:00:00.000 6   70  3   0   0   0   10  3   3   3   3   0   0   0   0   18  0   0   0
29  438 945 Day 2019-06-04 00:00:00.000 6   0   0   0   7   0   33  1   0   0   0   0   0   10  0   16  0   0   0
30  438 945 Day 2019-06-04 00:00:00.000 6   0   0   0   7   0   33  1   0   0   0   0   0   10  0   16  0   0   0
31  476 947 Day 2019-06-04 00:00:00.000 6   0   0   0   5   0   0   0   0   2   0   0   0   0   0   1   0   0   0
32  428 952 Night   2019-06-05 00:00:00.000 6   25  4   0   0   0   0   4   4   4   4   0   0   0   0   0   0   0   0
33  422 945 Night   2019-06-04 00:00:00.000 6   0   0   0   3   0   2   1   4   4   4   0   0   0   0   4   0   0   0
34  479 947 Night   2019-06-04 00:00:00.000 6   0   0   0   7   0   0   0   0   1   0   0   0   0   0   5   0   0   1
35  364 949 Night   2019-06-05 00:00:00.000 6   5   0   0   3   0   0   0   3   3   3   0   0   0   0   20  0   0   0
36  476 947 Day 2019-06-05 13:52:27.423 6   0   0   0   7   0   0   0   0   2   0   0   0   0   0   6   0   0   0
37  541 952 Day 2019-06-05 00:00:00.000 6   60  3   0   0   0   10  3   3   3   3   0   0   0   0   18  0   0   0
38  535 952 Day 2019-06-05 00:00:00.000 6   60  3   0   0   0   10  3   3   3   3   0   0   0   0   18  0   0   0
39  364 949 Day 2019-06-05 00:00:00.000 6   0   0   0   6   0   0   0   1   1   1   0   0   0   0   12  0   0   0
40  476 951 Day 2019-06-05 00:00:00.000 6   0   0   0   0   0   0   0   0   0   0   0   3   2   3   7   0   24  0
41  438 945 Day 2019-06-05 00:00:00.000 6   0   0   0   7   0   30  1   0   0   0   0   0   10  0   16  1   0   0
Run Code Online (Sandbox Code Playgroud)

我查看了 Stack Exchange 并使用该NULLIF功能似乎可能会有所帮助,但我无法让它与此查询一起使用。

Pau*_*ite 5

以下代码通过外部连接必须出现在输出中的站点列表来生成您想要的结果,数据查询的结果按站点 ID 分组。

SELECT
    Sites.fkSiteID,
    NumChecks = ISNULL(Totals.NumChecks, 0)
FROM (VALUES (945),(947),(948),(949),(950),(951),(952)) AS Sites (fkSiteID)
LEFT JOIN
(
    SELECT
        AODAR.fkSiteID,
        NumChecks =
            SUM(AODAR.SearchTypePerson) + 
            SUM(AODAR.SearchTypeLocker) + 
            SUM(AODAR.SearchTypeSpotRandom) + 
            SUM(AODAR.SearchTypePersVehicle) + 
            SUM(AODAR.SearchTypeVisitorContractorVehicle) + 
            SUM(AODAR.SearchTypeCompanyVehicle) + 
            SUM(AODAR.SearchTypeToilet) + 
            SUM(AODAR.PatrolExternal) + 
            SUM(AODAR.PatrolCarPark) + 
            SUM(AODAR.PatrolPerimeter) + 
            SUM(AODAR.PatrolInternal) + 
            SUM(AODAR.VehicleCheckAmbientLine) + 
            SUM(AODAR.VehicleCheckFridgeLine) + 
            SUM(AODAR.VehicleCheckSealChecks) + 
            SUM(AODAR.OtherChecksIDCards) + 
            SUM(AODAR.OtherChecksIncidentReports) + 
            SUM(AODAR.OtherChecksColdStoreChecks)
    FROM dbo.AAHOfficerDailyActivityReport AS AODAR
    WHERE
        AODAR.MonthOfReport = 6 
        AND AODAR.RecordIsDeletedYN = 0
    GROUP BY 
        AODAR.fkSiteID
) AS Totals
    ON Totals.fkSiteID = Sites.fkSiteID
ORDER BY
    Sites.fkSiteID;
Run Code Online (Sandbox Code Playgroud)

结果:

SELECT
    Sites.fkSiteID,
    NumChecks = ISNULL(Totals.NumChecks, 0)
FROM (VALUES (945),(947),(948),(949),(950),(951),(952)) AS Sites (fkSiteID)
LEFT JOIN
(
    SELECT
        AODAR.fkSiteID,
        NumChecks =
            SUM(AODAR.SearchTypePerson) + 
            SUM(AODAR.SearchTypeLocker) + 
            SUM(AODAR.SearchTypeSpotRandom) + 
            SUM(AODAR.SearchTypePersVehicle) + 
            SUM(AODAR.SearchTypeVisitorContractorVehicle) + 
            SUM(AODAR.SearchTypeCompanyVehicle) + 
            SUM(AODAR.SearchTypeToilet) + 
            SUM(AODAR.PatrolExternal) + 
            SUM(AODAR.PatrolCarPark) + 
            SUM(AODAR.PatrolPerimeter) + 
            SUM(AODAR.PatrolInternal) + 
            SUM(AODAR.VehicleCheckAmbientLine) + 
            SUM(AODAR.VehicleCheckFridgeLine) + 
            SUM(AODAR.VehicleCheckSealChecks) + 
            SUM(AODAR.OtherChecksIDCards) + 
            SUM(AODAR.OtherChecksIncidentReports) + 
            SUM(AODAR.OtherChecksColdStoreChecks)
    FROM dbo.AAHOfficerDailyActivityReport AS AODAR
    WHERE
        AODAR.MonthOfReport = 6 
        AND AODAR.RecordIsDeletedYN = 0
    GROUP BY 
        AODAR.fkSiteID
) AS Totals
    ON Totals.fkSiteID = Sites.fkSiteID
ORDER BY
    Sites.fkSiteID;
Run Code Online (Sandbox Code Playgroud)

db<>小提琴演示