缩短GROUP BY条款

时间:2009-10-19 14:00:10

标签: sql sql-server tsql grouping distinct

是否可以缩短group by子句,以便您不必重复select子句中提到的字段?例如:

SELECT
   field1,
   field2,
   field3,
   field4
FROM table
GROUP BY
   field1,
   field2,
   field3,
   field4

 to:

SELECT
 field1,
 field2,
 field3,
 field4
FROM table
GROUP BY
 SELECT.*

......或者这种效果。我正在编写一个将使用sp_executesql()存储过程的查询,并且我的变量中的空间不足。非常感谢。

4 个答案:

答案 0 :(得分:11)

您在寻找SELECT DISTINCTSELECT DISTINCTROW吗?

答案 1 :(得分:8)

SELECT
   field1,
   field2,
   field3,
   field4
FROM table
GROUP BY 1,2,3,4

数字表示选择部分中的列位置。

答案 2 :(得分:1)

DISTINCT和GROUP BY之间存在显着差异。在简单查询中,它们可能是相同的,但当然,GROUP BY允许聚合。

但是除此之外,DISTINCT将在执行DISTINCT之前计算每个字段,即使它们是相同字段的确定性使用(例如,StartDate和DATEADD(day,1,StartDate) - 检查执行计划,你会看到DATEADD在DISTINCT之前完成。所以GROUP BY几乎总是更好。

但是......值得注意的是,只要GROUP BY包含具有唯一索引的内容(例如主键),该表中的任何其他项都将被忽略。毕竟,通过在GROUP BY子句中包含其他字段,您无法获得更多唯一性。

那么为什么不采取以下方法:

GROUP BY t.id, u.id
/* All these other fields are ignored but here because they're 
   in the HAVING/SELECT/ORDER BY clauses
*/
, t.TransactionValue, u.Username, ....

我知道你仍然需要输入全部内容,拥有GROUP BY t.*会很高兴,但如果你愿意,你可以通过https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=124654投票让微软了解

答案 3 :(得分:0)

它们有两个不同的概念:

  • SELECT = output
  • GROUP BY =汇总的内容

现在,每个SELECT条目必须聚合在一起或在GROUP BY中。通常,GROUP BY还有更多的SELECT列。

但是,我怀疑你聚集太多/太晚了。您可以使用派生表或CTE“更早”地执行操作。

SELECT 
   T1.field1, T1.field2, foo.field3, foo.field4, foo.AggField5
FROM
   table T1
   JOIN
   (SELECT
        T2.keycol, T2.field3, T2.field4, SUM(T2.field5) AS AggField5
   FROM 
        table T2
   GROUP BY 
        T2.keycolT2.field3, T2.field4
   ) foo ON T1.Keycol = foo.keycol

在您的示例中,使用不带GROUP BY的DISTINCT ...