2014-12-24 28 views
2

为什么添加列到选择列表和group by by查询会增加返回的行数?例如,下面是我的基本查询,但如果我添加列,我会返回更多的行。添加的列越多,返回的行就越多。看起来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 

回答

1

当添加WHERE子句,它过滤设定接下来将流传下来的GROUP BY行,所以WHERE施加之前基团。在GROUP BY被应用之前,将被分组并且将在其上执行像SUM(),MAX(),MIN(),COUNT()那样的聚合的行已经被限于那些匹配WHERE条件的行。

至于为什么在将列添加到SELECTGROUP BY时获得更多行 - 那么,GROUP BY聚合就是如此工作的。如果您将其他列添加到SELECT中,则还必须对它们进行分组(大多数RDBMS中),并且只要行之间的值不同,它们将导致更多的分组行。

考虑一下这个表:

Name Score 
John 2 
Bill 3 
John 1 

GROUP BYNameJohn行折叠成一个:

SELECT Name, SUM(Score) AS total 
FROM scores 
GROUP BY name 

Name total 
John 3 
Bill 3 

现在考虑这个表,这对于运动的另一列。在这里,John有2个不同的运动代表,而比尔只有1个。要在SELECT列表中包括Name, Sport,他们必须都在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应用组。结果将是两行。

SELECT Name, Sport, SUM(Score) AS total 
FROM scores 
-- Filter with a WHERE clause this time 
WHERE Name = 'John' 
GROUP BY Name, Sport 

-- Results in only John's rows 
Name Sport Score 
John Baseball 3 
John Bowling 21 
+0

我现在明白了。优秀的解释,谢谢! – wallenpb

0

考虑表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 | 
+-----------+------------+-------+ 
+0

很好的例子,谢谢! – wallenpb

0

添加一个新组通过增加你看beacuase每个group by分区以另一种方式的数据结果的数量。

如果你只使用聚合函数,你只能得到一个单行结果,更精细你组数据中出现的结果行,你会看到

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

+0

是的,我现在明白了。非常感谢答复。 – wallenpb