这困扰了我很长一段时间。
99%的时间,GROUP BY子句是SELECT子句的精确副本,减去聚合函数(MAX,SUM等)。 这违反了“不要重复自己”的原则。
什么时候GROUP BY子句不能包含SELECT子句减去聚合函数的精确副本?
我意识到有些实现允许您在GROUP BY中使用与SELECT中不同的字段(因此99%,而不是100%),但是可以肯定的是,这是一个非常小的例外? 有人可以解释如果您使用其他字段应该返回什么?
谢谢。
我倾向于同意您的看法-这是许多情况下SQL应该具有更聪明的默认值以节省我们所有键入内容的情况之一。例如,想象一下这是否合法:
Select ClientName, InvoiceAmount, Sum(PaymentAmount) Group By *
其中“”表示“所有非聚合字段”。如果每个人都知道这是如何工作的,那么就不会造成混乱。如果您想做一些棘手的事情,可以在一个特定的字段列表中查找子项,但是splat表示“全部”(在此情况下,表示所有 可能* 的)。
当然,“ *”在这里的含义与SELECT子句中的有所不同,因此使用不同的字符可能会更好:
Select ClientName, InvoiceAmount, Sum(PaymentAmount) Group By !
像SQL这样的其他一些领域并没有那么雄辩。但是在这一点上,它可能已经根深蒂固,无法进行许多重大更改。