Sql server SQLServerMax和GROUP不能很好地配合使用

Sql server SQLServerMax和GROUP不能很好地配合使用,sql-server,tsql,group-by,max,aggregate-functions,Sql Server,Tsql,Group By,Max,Aggregate Functions,我有一个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 '

我有一个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_版本,换句话说:

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最新/词汇学最高的buzz_版本,其他Fizzs也是如此

因此,我尝试使用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
但这给了我一个错误:

列“fizz.fizz_name”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中


我错在哪里?为什么?

您希望每个fizz_名称有一个结果行,因此必须按fizz_名称分组。您可以使用它显示MAXb.buzz_版本,并且必须决定显示哪个fu.foo_名称。例如:

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分组

您是按查询中的聚合进行分组的。您需要改为按标量列分组。在本例中,按f.fizz_name、fu.foo_name分组假设您的版本号是一个字符串,如果您不小心处理数据,max可能会给您带来问题。例如,0.10.1版本比0.2.1版本小,因为按字母顺序排序谢谢@SeanLange+1-将其放入答案中,我会给它一个绿色复选框!谢谢@JamesZ+1-是的,这个版本是一个字符串-除了MAX,我还能用什么呢。。。为了逃避这个?!?您的示例非常完美:我希望0.10.1比0.2.1大,有什么想法吗?@smeeb如果您可以在版本号上加零,那么max将自动工作,例如0.0010.1对0.0002.1工作正常-其他替代方案可能需要将其作为几个单独的数字处理,这可能需要更复杂的处理。例如,使用cross apply+order by而不是MaxThank@Thorsten Kettner+1-请参阅我对JamesZ的评论,关于MAX的使用。。。在这个例子中。你知道什么是更合适的合计吗?再次感谢!您必须格式化您的版本字符串。假设第一位和第二位总是一位数,但第三位是一到五位数:MAXstuffb.buzz_版本,4,1,复制'0',9-lenb.buzz_版本。如果第一个和第二个数字也可以是多个数字,则需要另一个字符串操作。在此服务器上查找SQL Server字符串函数。