为什么通过添加列来增加返回的行数

时间:2014-12-24 03:16:52

标签: sql sql-server

为什么在查询中将列添加到选择列表和分组会增加返回的行数?例如,下面是我的基本查询,但如果我添加列,我会返回更多行。添加的列越多,返回的行数就越多。看来where子句条件应该是控制返回行的唯一因素。

示例查询:

select pobj_name, max(prev) prev 
from pfmc_part 
where pmodel in ('PN-DWG', 'NO-DWG') and pstatus = 'RELEASED' 
group by pobj_name 
order by pobj_name

3 个答案:

答案 0 :(得分:5)

当您添加WHERE子句时,它会过滤将在GROUP BY旁边传递的行集,因此{/ 1}}会在之前应用组。将要执行的分组行以及WHERE之类的聚合内容已经限制为与应用SUM(),MAX(),MIN(),COUNT()之前的WHERE条件相匹配的行。

关于为GROUP BYSELECT添加列时获得更多行的原因 - 嗯,这就是GROUP BY聚合工作的方式。如果在GROUP BY中添加其他列,则还必须对它们进行分组(在大多数RDBMS中),只要值在行之间不同,它们就会产生更多的分组行。

考虑下表:

SELECT

Name Score John 2 Bill 3 John 1 上的一个GROUP BY会将Name行合并为一行:

John

现在考虑一下这个表,它有另一个运动专栏。在这里,SELECT Name, SUM(Score) AS total FROM scores GROUP BY name Name total John 3 Bill 3 代表了2种不同的体育项目,而比尔只有1项。要在John列表中同时包含Name, Sport,它们也必须都在SELECT中。跨行的类似值会合并到组中,但现在GROUP BY两个类似值的组:

John

因此,如果列在行之间具有不同的值,则向Name Sport Score John Baseball 3 John Bowling 9 Bill Baseball 10 Bill Baseball 6 John Bowling 12 SELECT Name, Sport, SUM(Score) AS total FROM scores GROUP BY Name, Sport Name Sport total John Baseball 3 John Bowling 21 Bill Baseball 16 添加其他列将导致更多输出行。

GROUP BY子句应用于此第二个表以仅查找WHERE行,将在应用组之前消除所有John。结果将是两行。

Bill

答案 1 :(得分:1)

考虑表StudentScores:

+-----------+------------+-------+
| Last_Name | First_Name | Score |
+-----------+------------+-------+
| Smith     | Bob        |    90 |
| Smith     | Bob        |    85 |
| Smith     | Alice      |   100 |
| Smith     | Alice      |    90 |
| Johnson   | Evelyn     |    80 |
| Johnson   | Evelyn     |    85 |
+-----------+------------+-------+

此查询:

SELECT Last_Name, MAX(Score) Score
FROM StudentScores
GROUP BY Last_Name

结果:

+-----------+-------+
| Last_Name | Score |
+-----------+-------+
| Smith     |   100 |
| Johnson   |    85 |
+-----------+-------+

但是,这个查询:

SELECT Last_Name, MAX(Score) Score
FROM StudentScores
GROUP BY Last_Name, First_Name

结果:

+-----------+-------+
| Last_Name | Score |
+-----------+-------+
| Smith     |    90 |
| Smith     |   100 |
| Johnson   |    85 |
+-----------+-------+

那有什么不同?好吧,'Smith'是两个学生中的Last_Name

SELECT Last_Name, First_Name, MAX(Score) Score
FROM StudentScores
GROUP BY Last_Name, First_Name

结果:

+-----------+------------+-------+
| Last_Name | First_Name | Score |
+-----------+------------+-------+
| Smith     | Bob        |    90 |
| Smith     | Alice      |   100 |
| Johnson   | Evelyn     |    85 |
+-----------+------------+-------+

答案 2 :(得分:1)

添加新的group-by会增加您看到的结果数量,每个group by以另一种方式对数据进行分区。

如果您只使用聚合函数,则只获得单行结果,您对数据进行分组的次数越多,您将看到的结果行越多

where子句控制由group by执行的分组的输入。 having子句(如果存在)将控制返回给用户的结果。