我正在尝试设置一个 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。有什么方法可以防止这种情况发生?
请帮我纠正这个问题。谢谢你。
您需要在联合选择中添加相同的 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)
你应该避免做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)
这样你所有的过滤器也只写一次。