两个SQL查询的输出差异

时间:2016-02-05 22:14:18

标签: sql sql-server

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

查询1:

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

QUERY2:

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

2 个答案:

答案 0 :(得分:4)

当然,这些是不同的。 Query2的Group By子句指定一个额外的字段。这意味着当聚合结果时,它们将聚合为Field1 AND 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

如果您还需要相关的性别计数

,它会有点毛茸茸(需要子查询)

答案 1 :(得分:0)

查询2中的额外group by子句过滤记录。要了解更多信息,请参阅下面的示例。

测试数据:

id name 
1   a
2   b
3   a
4   a

因此,当我按名称分组时,sql首先过滤掉名称的不同记录,如下面的查询所示

select name,sum(id)
from test
group by name

- 首先按列(此处为名称)过滤掉不同的值

a

b

- 每个不同记录的下一个,有多少值属于该类别..

a   1  a
    4  a
    3  a

b  2  b

所以从上面的组中,现在你可以在我们的情况下计算组中的任何聚合,它是sum,所以下一个输出会有类似的东西

a  8

b 2  

从上面的输出中可以看出,你也可以计算出任何关于群组的聚合(这里是a和b值),比如在下面的组上给我数(id),len(名字)

select name,len(name),sum(id)
from test
group by name

当你按另一个字段分组时会发生同样的事情,比如说如下

select id,name
from 
test
group by id,name

所以在上面的例子中,sql首先过滤id,name

的alldistinct记录
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

现在你可以在上面的群体上计算aggergations。这有助于可视化你的小组。进一步逐步消除小组,在那里逐个消除记录