在group by中,是否有一种方法可以告诉SQL特定列不需要聚合函数?

我最近开始使用T-SQL,并且遇到了按功能分组的问题。

假设我有一个包含3列的表:Column_1,Column_2和Column_3。我知道,对于给定的Column_1值,Column_2将始终具有给定的值。另一方面,Column_3独立于Column_1。

所以表可能看起来像这样:

Column_1    Column_2    Column_3 
1           42          57 
1           42          35 
2           3           5
2           3           6 
5           78          45 

我想对Column_1进行分组,以汇总Column_3(比方说一个sum())。但是,当我进行分组时,即使我知道没有必要,也必须对Column_2进行分组或汇总。

所以我的SQL请求将是:

select Column_1,Column_2,sum(Column_3) 
from Table 
group by Column_1,Column_2

select Column_1,max(Column_2),sum(Column_3) 
from Table 
group by Column_1
(using max as a workaround to avoid grouping by Column_2)

我的问题是:有没有办法告诉SQL Column_2不需要聚合函数,并让SQL检查假设是否正确?

我认为这是一个最佳选择,因为它可以确保我的假设正确。当使用前两个请求时,我永远不会100%确认是这种情况(除非在请求之前以其他方式检查它),并且可能会导致难以识别的错误(尤其是在使用最大解决方法时)。

理想情况下,我希望能够编写如下内容:

select Column_1,no_agg_necessary(Column_2),sum(Column_3) 
from Table 
group by Column_1

如果按给定的Column_1值分组时Column_2的值不相同,则会出现警告。

我当时在想选择Column_2可以满足我的需求:

case when count(distinct Column_2) = 1 then max(Column_2) else raiseerror() end as Column_2

但是在这样的上下文中似乎不可能使用raiseerror(),并且添加distinct会减慢请求的速度。

您是否知道可以满足我需求的任何SQL功能?

xcmk27 回答:在group by中,是否有一种方法可以告诉SQL特定列不需要聚合函数?

SQL Server或任何其他数据库中不支持您要的内容。某些数据库支持功能依赖关系,但它们会查看表的定义以查看值是否必须相关(即column1unique)。在其他情况下,他们不会检查数据是否具有唯一值。

一般来说,SQL(尤其是SQL Server)并不擅长在SELECT语句中产生错误。可以使用CASE表达式。在非聚合查询中,SQL Server保证评估顺序,以至于在编译阶段不评估错误。

因此,您可以将所需内容写为:

select x,(case when min(y) = max(y)
             then min(y) else convert(int,'Bad column value')
        end)
from (values (1,1),(1,2)) v(x,y)
group by x;

我真的不建议以这种方式处理查询。您应该将数据验证作为一个单独的步骤,这样您对获得的结果并不感到惊讶。

,

您的示例数据缺少“问题”

如果我添加行,您将如何处理查询

1-41-19

您现在对该列具有多个值。希望结果如何?

41? 42? “无效”?

因此,为了保持数据正确,您需要将其最可能切成2个结果记录,这可以通过将其添加到group子句中来实现。

如果您不太关心数据,则可以使用诸如min()或max()之类的虚拟函数,或者如果您想花哨的话,则可以在Min()处注入值“无效” Max()

本文链接:https://www.f2er.com/3152986.html

大家都在问