【问题标题】:Difference in output from two SQL queries两个 SQL 查询的输出差异
【发布时间】:2016-02-05 22:14:18
【问题描述】:

除了 Query2 返回一个附加字段之外,下面的两个 SQL 查询有什么区别?是否存在两个查询的输出可能不同的情况(除了 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

【问题讨论】:

  • 查询 1 在语法上不正确。它们通常会返回不同数量的行。这两个人真的没什么关系。
  • 1,1 | 1,2。这 2 条记录向您展示了不同输出的示例。
  • 任何时候 Field2 的任何值对应于 Field1 的多个值,您都会得到不同的结果。
  • 非常好的答案,您应该阅读...stackoverflow.com/questions/2421388/…

标签: sql sql-server


【解决方案1】:

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

如果您还需要相关的性别计数,它会有点麻烦(需要子查询)

【讨论】:

  • 非常感谢您花时间解释。你太棒了。有什么办法,我可以只返回由 Field2 分解的行吗?例如:在您答案的最后一组结果中,我将如何仅返回同时存在男性和女性数据的职业? (即在示例中,不会返回 Tester 的行,因为它只有男性的数据)
  • 当然,我用附加信息更新了我的答案
  • 谢谢!但是有什么方法可以做到,而不必在代码中指定 Field2 的可能值?在我拥有的表中,Field2 有许多可能的值
【解决方案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

b

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

a   1  a
    4  a
    3  a

b  2  b

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

a  8

b 2  

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

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

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

select id,name
from 
test
group by id,name

所以在上述情况下,sql首先过滤所有不同的记录以获取id,name

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

现在您可以计算上述组的聚合。希望这有助于可视化您的组。进一步将在组之后消除组,其中将在组之前消除记录

【讨论】:

    猜你喜欢
    • 2011-03-30
    • 2011-01-05
    • 1970-01-01
    • 2022-12-19
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多