3

是否可以缩短 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

4 回答 4

11

你在找吗SELECT DISTINCTSELECT DISTINCTROW

于 2009-10-19T14:01:55.273 回答
8
SELECT
   field1,
   field2,
   field3,
   field4
FROM table
GROUP BY 1,2,3,4

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

于 2009-10-19T14:02:25.440 回答
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投票让 Microsoft 知道.aspx?反馈ID=124654

于 2010-01-04T02:20:04.660 回答
0

它们是两个不同的概念:

  • 选择 = 输出
  • 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

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

于 2009-10-19T14:11:26.747 回答