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