Sql GroupBy返回超出限制的结果
我试图为分组但在where语句之外的数据包含默认值 表格Sql GroupBy返回超出限制的结果,sql,sql-server,Sql,Sql Server,我试图为分组但在where语句之外的数据包含默认值 表格 Name Location ----------------------- Chris North John North Jane North-East Bryan South 查询 SELECT Location, COUNT(*) FROM Users WHERE Location = 'North' OR Location = 'North-East' GROUP BY Location
Name Location
-----------------------
Chris North
John North
Jane North-East
Bryan South
查询
SELECT
Location,
COUNT(*)
FROM Users
WHERE Location = 'North' OR Location = 'North-East'
GROUP BY Location
输出
North 2
North-East 1
North 2
North-East 1
South 0
所需输出
North 2
North-East 1
North 2
North-East 1
South 0
是否可以为where子句之外的每个位置返回零
更新
Name Location
-----------------------
Chris North
John North
Jane North-East
Bryan South
谢谢大家的帮助。我最终使用了左连接,因为这对我来说是最快的,并且产生了正确的结果
DECLARE @Locations as Table(Name varchar(20));
DECLARE @Users as Table(Name varchar(20), Location varchar(20));
INSERT INTO @Users VALUES ('Chris', 'North')
INSERT INTO @Users VALUES ('John', 'North')
INSERT INTO @Users VALUES ('Jane', 'North-East')
INSERT INTO @Users VALUES ('Bryan', 'South')
INSERT INTO @Locations VALUES ('North')
INSERT INTO @Locations VALUES ('North-East')
INSERT INTO @Locations VALUES ('South')
SELECT
l.Name,
count(u.location)
FROM
@Locations l
LEFT JOIN
@Users u on l.Name = u.location and u.location in ('North', 'North-East')
group by
l.Name;
我认为最简单的方法是使用条件聚合:
SELECT Location,
SUM(CASE WHEN Location IN ('North', 'North-East') THEN 1 ELSE 0 END) as cnt
FROM Users u
GROUP BY Location;
或者,如果您有位置表,则更好:
select l.location, count(u.location)
from locations l left join
users u
on l.location = u.location and
u.location in ('North', 'North-East')
group by l.location;
我认为最简单的方法是使用条件聚合:
SELECT Location,
SUM(CASE WHEN Location IN ('North', 'North-East') THEN 1 ELSE 0 END) as cnt
FROM Users u
GROUP BY Location;
或者,如果您有位置表,则更好:
select l.location, count(u.location)
from locations l left join
users u
on l.location = u.location and
u.location in ('North', 'North-East')
group by l.location;
假设没有locations表,唯一的方法是执行DISTINCT和sub select
SELECT DISTINCT
Location,
(SELECT COUNT(*) FROM users AS U
WHERE U.Name = Users.Name
AND Location = 'North' OR Location = 'North-East')
FROM Users
WHERE Location = 'North' OR Location = 'North-East'
此代码执行大量表扫描,并且在生产环境中的大型表上运行时可能会导致系统出现问题,在生产环境中,此查询将一天运行多次。假设没有位置表,唯一的方法是执行DISTINCT和sub select
SELECT DISTINCT
Location,
(SELECT COUNT(*) FROM users AS U
WHERE U.Name = Users.Name
AND Location = 'North' OR Location = 'North-East')
FROM Users
WHERE Location = 'North' OR Location = 'North-East'
此代码执行大量表扫描,并且在生产环境中的大型表上运行此查询时,可能会导致系统出现问题。以及基于@GordonLinoff answer的第三个选项,但给出正确的结果如下所示。这使用一个子查询来获取位置的不同列表,并将其左连接到users表
select l.location, count(u.location)
from (SELECT DISTINCT Location FROM Users) l
left join users u
on l.location = u.location and
u.location in ('North', 'North-East')
group by l.location
第三个选项基于@GordonLinoff答案,但给出正确的结果如下。这使用一个子查询来获取位置的不同列表,并将其左连接到users表
select l.location, count(u.location)
from (SELECT DISTINCT Location FROM Users) l
left join users u
on l.location = u.location and
u.location in ('North', 'North-East')
group by l.location
你的第二个是我要去的地方,但它给出了一个不正确的结果(4代表
北方
)你的第二个是我要去的地方,但它给出了一个不正确的结果(4代表北方
)