Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql GroupBy返回超出限制的结果_Sql_Sql Server - Fatal编程技术网

Sql GroupBy返回超出限制的结果

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

我试图为分组但在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
输出

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代表
北方