这已经困扰了我很长一段时间.
99%的时候,GROUP BY子句是SELECT子句的精确副本,减去了聚合函数(MAX,SUM等).
这打破了"不要重复自己"的原则.
什么时候GROUP BY子句不能包含SELECT子句的精确副本减去聚合函数?
我意识到一些实现允许你在GROUP BY中使用不同于SELECT的字段(因此99%,而不是100%),但这肯定是一个非常小的例外?
如果您使用不同的字段,有人可以解释应该返回的内容吗?
谢谢.
我倾向于同意你的观点 - 这是SQL应该有一些更智能的默认设置来保存我们所有打字的情况之一.例如,假设这是合法的:
Select ClientName, InvoiceAmount, Sum(PaymentAmount) Group By *
其中"*"表示"所有非聚合字段".如果每个人都知道它是如何工作的,那么就不会有混淆.如果你想做一些棘手的事情,你可以在一个特定的字段列表中进行分析,但是splat意味着"所有'em'(在这个上下文中意味着所有可能的).
当然,"*"在这里意味着与SELECT子句不同的东西,所以也许一个不同的角色可以更好地工作:
Select ClientName, InvoiceAmount, Sum(PaymentAmount) Group By !
还有一些其他领域,其中SQL并不像它本身那样雄辩.但在这一点上,它可能已经根深蒂固地做出了许多重大改变.
因为它们是两个不同的东西,所以您可以按照不在select子句中的项目进行分组
编辑:
此外,做出这个假设是否安全?
我有一个SQL语句
Select ClientName, InvAmt, Sum(PayAmt) as PayTot
服务器假设我想按ClientName和InvoiceAmount进行分组是否"正确"?我个人更喜欢(并认为它更安全)拥有此代码
Select ClientName, InvAmt, Sum(PayAmt) as PayTot Group By ClientName
抛出错误,提示我将代码更改为
Select ClientName, Sum(InvAmt) as InvTot, Sum(PayAmt) as PayTot Group By ClientName