SQL 服务器 MAX 和 GROUP BY 不能很好地协同工作
SQL Server MAX and GROUP BY not playing nicely together
我有一个 T-SQL 形式的查询:
SELECT f.fizz_name, b.buzz_version, fu.foo_name
FROM fizz f
INNER JOIN buzz b
ON f.fizz_id = b.fizz_id
INNER JOIN foo fu
ON b.buzz_id = fu.buzz_id
WHERE f.bar LIKE 'YES'
当我 运行 这个查询时,我得到以下结果:
fizz_name buzz_version foo_name
====================================
Gamma 0.3.960 Test
Gamma 0.3.961 Test
Gamma 0.3.960 Test
Gamma 0.3.961 Test
Delta 0.3.2588 Test
Delta 0.3.2589 Test
Delta 0.3.2588 Test
Delta 0.3.2589 Test
Echo 2.2.38 Test
Echo 2.2.38 Test
问题是它包含很多我不关心的条目。实际上,我只关心每个 fizz
实例的最大 buzz_version
,换句话说:
fizz_name buzz_version foo_name
====================================
Gamma 0.3.961 Test
Delta 0.3.2589 Test
Echo 2.2.38 Test
...因为“2.2.38”是 Echo
的 latest/lexiconographically-highest buzz_version
,其他嘶嘶声也是如此。
所以我尝试使用 GROUP BY
与 MAX
一起获取这些值,如下所示:
SELECT f.fizz_name, MAX(b.buzz_version), fu.foo_name
FROM fizz f
INNER JOIN buzz b
ON f.fizz_id = b.fizz_id
INNER JOIN foo fu
ON b.buzz_id = fu.buzz_id
WHERE f.bar LIKE 'YES'
GROUP BY b.buzz_version
但这给了我一个错误:
Column 'fizz.fizz_name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
我哪里出错了,为什么?
您希望每个 fizz_name 一个结果行,因此您必须按 fizz_name 分组。你用它显示 MAX(b.buzz_version) 并且必须决定显示哪个 fu.foo_name 。例如:
SELECT f.fizz_name, MAX(b.buzz_version), MAX(fu.foo_name)
FROM fizz f
INNER JOIN buzz b ON f.fizz_id = b.fizz_id
INNER JOIN foo fu ON b.buzz_id = fu.buzz_id
WHERE f.bar LIKE 'YES'
GROUP BY f.fizz_name;
您正在按查询中的聚合进行分组。您需要改为按标量列分组。在这种情况下,按 f.fizz_name、fu.foo_name
分组
我有一个 T-SQL 形式的查询:
SELECT f.fizz_name, b.buzz_version, fu.foo_name
FROM fizz f
INNER JOIN buzz b
ON f.fizz_id = b.fizz_id
INNER JOIN foo fu
ON b.buzz_id = fu.buzz_id
WHERE f.bar LIKE 'YES'
当我 运行 这个查询时,我得到以下结果:
fizz_name buzz_version foo_name
====================================
Gamma 0.3.960 Test
Gamma 0.3.961 Test
Gamma 0.3.960 Test
Gamma 0.3.961 Test
Delta 0.3.2588 Test
Delta 0.3.2589 Test
Delta 0.3.2588 Test
Delta 0.3.2589 Test
Echo 2.2.38 Test
Echo 2.2.38 Test
问题是它包含很多我不关心的条目。实际上,我只关心每个 fizz
实例的最大 buzz_version
,换句话说:
fizz_name buzz_version foo_name
====================================
Gamma 0.3.961 Test
Delta 0.3.2589 Test
Echo 2.2.38 Test
...因为“2.2.38”是 Echo
的 latest/lexiconographically-highest buzz_version
,其他嘶嘶声也是如此。
所以我尝试使用 GROUP BY
与 MAX
一起获取这些值,如下所示:
SELECT f.fizz_name, MAX(b.buzz_version), fu.foo_name
FROM fizz f
INNER JOIN buzz b
ON f.fizz_id = b.fizz_id
INNER JOIN foo fu
ON b.buzz_id = fu.buzz_id
WHERE f.bar LIKE 'YES'
GROUP BY b.buzz_version
但这给了我一个错误:
Column 'fizz.fizz_name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
我哪里出错了,为什么?
您希望每个 fizz_name 一个结果行,因此您必须按 fizz_name 分组。你用它显示 MAX(b.buzz_version) 并且必须决定显示哪个 fu.foo_name 。例如:
SELECT f.fizz_name, MAX(b.buzz_version), MAX(fu.foo_name)
FROM fizz f
INNER JOIN buzz b ON f.fizz_id = b.fizz_id
INNER JOIN foo fu ON b.buzz_id = fu.buzz_id
WHERE f.bar LIKE 'YES'
GROUP BY f.fizz_name;
您正在按查询中的聚合进行分组。您需要改为按标量列分组。在这种情况下,按 f.fizz_name、fu.foo_name
分组