Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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查询的输出差异_Sql_Sql Server - Fatal编程技术网

两个SQL查询的输出差异

两个SQL查询的输出差异,sql,sql-server,Sql,Sql Server,下面两个SQL查询之间的区别是什么,除了Query2返回一个附加字段之外?是否存在两个查询的输出不同的可能情况(Query2中的附加字段除外) 问题1: SELECT Field1, COUNT(*) FROM Table1 GROUP BY Field1 HAVING COUNT(*) > 1 问题2: SELECT Field1, Field2, COUNT(*) FROM Table1 GROUP BY Field1, Field2 HAVING COUNT(*) > 1

下面两个SQL查询之间的区别是什么,除了Query2返回一个附加字段之外?是否存在两个查询的输出不同的可能情况(Query2中的附加字段除外)

问题1:

SELECT Field1, COUNT(*)
FROM Table1
GROUP BY Field1
HAVING COUNT(*) > 1
问题2:

SELECT Field1, Field2, COUNT(*)
FROM Table1
GROUP BY Field1, Field2
HAVING COUNT(*) > 1

当然,这些是不同的。Query2的GROUPBY子句指定一个额外字段。这意味着在聚合结果时,它们将聚合为Field1和Field2的组合唯一值。也就是说,当且仅当Field1和Field2相等时,两条记录才会聚合

例如:

SELECT Profession, Count(*)
FROM People
GROUP BY Profession
HAVING Count(*) > 1
将返回包含相关计数的专业列表,如:

Software Developer, 10
PM, 5
Tester, 2
鉴于:

SELECT Profession, Gender, Count(*)
FROM People
GROUP BY Profession, Gender
HAVING Count(*) > 1
将返回按性别分列的职业列表,如:

Software Developer, Male, 5
Sofware Developer, Female, 5
PM, Male, 3
PM, Female, 2
Tester, Male, 2
使用请求的其他信息进行编辑:

您可以通过以下方式检索具有两种性别行的职业计数:

SELECT Profession, Count(*)
FROM People
GROUP BY Profession
HAVING SUM(case Gender when 'Female' then 1 else 0 end) > 0 AND SUM(case Gender when 'Male' then 1 else 0 end) > 0

如果您还需要关联的性别计数,那么它会变得有点毛茸茸的(需要子查询)

绝对不同。Query2的GROUPBY子句指定一个额外字段。这意味着在聚合结果时,它们将聚合为Field1和Field2的组合唯一值。也就是说,当且仅当Field1和Field2相等时,两条记录才会聚合

例如:

SELECT Profession, Count(*)
FROM People
GROUP BY Profession
HAVING Count(*) > 1
将返回包含相关计数的专业列表,如:

Software Developer, 10
PM, 5
Tester, 2
鉴于:

SELECT Profession, Gender, Count(*)
FROM People
GROUP BY Profession, Gender
HAVING Count(*) > 1
将返回按性别分列的职业列表,如:

Software Developer, Male, 5
Sofware Developer, Female, 5
PM, Male, 3
PM, Female, 2
Tester, Male, 2
使用请求的其他信息进行编辑:

您可以通过以下方式检索具有两种性别行的职业计数:

SELECT Profession, Count(*)
FROM People
GROUP BY Profession
HAVING SUM(case Gender when 'Female' then 1 else 0 end) > 0 AND SUM(case Gender when 'Male' then 1 else 0 end) > 0

如果在查询2中还需要关联的性别计数,则会有点麻烦(需要子查询)。查询2筛选记录中需要额外的group by子句

测试数据:

id name 
1   a
2   b
3   a
4   a
所以,当我说“按名称分组”时,sql首先过滤出名称的不同记录,如下查询所示

select name,sum(id)
from test
group by name
--首先按列筛选出分组的不同值(此处为名称)

--接下来,对于每个不同的记录,有多少值属于该类别

a   1  a
    4  a
    3  a

b  2  b
从上面的组中,现在可以计算组中的任何聚合,在我们的例子中,它是sum,所以下一个输出将是这样的

a  8

b 2  
从上面的输出可以看出,您还可以计算组上的任何聚合(这里是a和b值),比如下面的组上的give me count(id)、len(name)

select name,len(name),sum(id)
from test
group by name
select id,name
from 
test
group by id,name
当您按另一个字段分组时,也会发生同样的情况,比如下面这样说

select name,len(name),sum(id)
from test
group by name
select id,name
from 
test
group by id,name
所以在上面的例子中,sql首先过滤所有不同记录的id、名称

1  a
2  b
3  a
4  a
下一步是获取每个组的记录

groupby columns  --columns which fall into this
1  a                1  a
2  b                2  b
3  a                3  a
4  a                4  a

现在,您可以计算以上组的聚合。希望这有助于通过可视化方式显示您的组。进一步的have将逐阶段逐组删除组,其中将逐阶段删除组之前的记录。查询2中的额外group by子句将筛选记录。要了解更多信息,请查看下面的示例

测试数据:

id name 
1   a
2   b
3   a
4   a
所以,当我说“按名称分组”时,sql首先过滤出名称的不同记录,如下查询所示

select name,sum(id)
from test
group by name
--首先按列筛选出分组的不同值(此处为名称)

--接下来,对于每个不同的记录,有多少值属于该类别

a   1  a
    4  a
    3  a

b  2  b
从上面的组中,现在可以计算组中的任何聚合,在我们的例子中,它是sum,所以下一个输出将是这样的

a  8

b 2  
从上面的输出可以看出,您还可以计算组上的任何聚合(这里是a和b值),比如下面的组上的give me count(id)、len(name)

select name,len(name),sum(id)
from test
group by name
select id,name
from 
test
group by id,name
当您按另一个字段分组时,也会发生同样的情况,比如下面这样说

select name,len(name),sum(id)
from test
group by name
select id,name
from 
test
group by id,name
所以在上面的例子中,sql首先过滤所有不同记录的id、名称

1  a
2  b
3  a
4  a
下一步是获取每个组的记录

groupby columns  --columns which fall into this
1  a                1  a
2  b                2  b
3  a                3  a
4  a                4  a

现在您可以计算以上组的聚合。希望这有助于通过可视化方式显示您的组。进一步的have将逐阶段逐组删除组,其中将逐阶段逐组删除记录查询1在语法上不正确。它们通常会返回不同数量的行。这两个人真的没有什么关系。1,1 | 1,2。这两条记录向您展示了一个不同输出的示例。任何时候,字段1的任何值都有多个字段2的值,您将得到不同的结果。非常好的答案您应该阅读。。。查询1在语法上不正确。它们通常会返回不同数量的行。这两个人真的没有什么关系。1,1 | 1,2。这两条记录向您展示了一个不同输出的示例。任何时候,字段1的任何值都有多个字段2的值,您将得到不同的结果。非常好的答案您应该阅读。。。非常感谢您花时间解释。你太棒了。有没有办法,我只能返回按字段2分解的行?例:在你回答的最后一组结果中,我如何只返回包含男性和女性数据的职业?(即,在本例中,Tester的行不会返回,因为它只包含男性的数据)当然,我用附加信息更新了我的答案谢谢!但是,我们有没有办法不必在代码中为Field2指定可能的值就可以做到这一点?在我的表格中,Field2Tanks有很多可能的值,需要花时间解释。你太棒了。有没有办法,我只能返回按字段2分解的行?例:在你回答的最后一组结果中,我如何只返回包含男性和女性数据的职业?(即,在本例中,Tester的行不会返回,因为它只包含男性的数据)当然,我用附加信息更新了我的答案谢谢!但是,我们有没有办法不必在代码中为Field2指定可能的值就可以做到这一点?在我的表中,Field2有许多可能的值