SQL Server COUNT() 似乎忽略了 WHERE

1 sql-server count where

我正在尝试设置一个 SQL Server 查询,该查询列出在会议活动期间注册参观的人数,然后显示总和。这是我即将接近的 SQL 代码,但它忽略了总计(但不是单个总计)的 WHERE 子句:

SELECT     SiteTour, COUNT(SiteTour) AS count
FROM       tblConference
WHERE      (RegistrationType NOT LIKE 'cancellation')
GROUP BY   SiteTour
UNION ALL
SELECT     'TOTAL' AS SiteTour, COUNT(SiteTour) AS Expr1
FROM       tblConference AS tblConference_1
Run Code Online (Sandbox Code Playgroud)

这是它正在生产的东西:

         0
Tour1   22
Tour2   30
Tour3   30
----------
TOTAL   83
Run Code Online (Sandbox Code Playgroud)

(Tour1 计数 22 是正确的,因为有一个 RegistrationType 取消。但是,83 的总数应该是 82。)

另外,我得到了一个初始行,我猜是基于对 NULL 的计数,显示为 0。有什么方法可以防止这种情况发生?

请帮我纠正这个问题。谢谢你。

Wes*_*Wes 5

您需要在联合选择中添加相同的 where 子句。

SELECT     SiteTour, COUNT(SiteTour) AS count
FROM       tblConference
WHERE      (RegistrationType NOT LIKE 'cancellation')
GROUP BY   SiteTour
UNION ALL
SELECT     'TOTAL' AS SiteTour, COUNT(tblConference_1.SiteTour) AS Expr1
FROM       tblConference AS tblConference_1
WHERE      (tblConference_1.RegistrationType NOT LIKE 'cancellation')
Run Code Online (Sandbox Code Playgroud)

  • 你怎么能得到一个零计数的行?这只能发生在外部联接中,而不是单个表的查询中。 (2认同)

EzL*_*zLo 5

你应该避免做COUNT两次。

;WITH Counts AS
(
    SELECT     SiteTour, COUNT(SiteTour) AS count
    FROM       tblConference
    WHERE      RegistrationType <> 'cancellation' AND SiteTour IS NOT NULL
    GROUP BY   SiteTour
),
Totals AS
(
    SELECT
        C.SiteTour,
        C.count
    FROM
        Counts AS C
    UNION ALL
    SELECT     
        'TOTAL' AS SiteTour, 
        SUM(C.count) AS count
    FROM
        Counts AS C
)
SELECT
    T.SiteTour,
    T.Count
FROM
    Totals AS T
ORDER BY
    CASE 
        WHEN T.SiteTour <> 'TOTAL' THEN 1
        ELSE 2 END,
    T.SiteTour
Run Code Online (Sandbox Code Playgroud)

这样你所有的过滤器也只写一次。