Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按子句缩短分组_Sql_Sql Server_Tsql_Grouping_Distinct - Fatal编程技术网

Sql 按子句缩短分组

Sql 按子句缩短分组,sql,sql-server,tsql,grouping,distinct,Sql,Sql Server,Tsql,Grouping,Distinct,是否可以缩短GROUPBY子句,这样就不必重复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.* …或者类似的东西。我正在编写一

是否可以缩短GROUPBY子句,这样就不必重复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()存储过程的查询,并且变量中的可用空间已用完。非常感谢。

您是在寻找
选择不同的
还是
选择不同的

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

其中数字表示选定零件中的立柱位置。

它们是两个不同的概念:

  • 选择=输出
  • 分组依据=要聚合的内容
现在,每个SELECT条目必须按聚合或分组。通常,“分组依据”也有更多的列供用户选择

然而,我怀疑你聚合得太多/太晚了。您可以使用派生表或CTE“更早”执行操作


但是,在您的示例中,使用DISTINCT而不使用GROUP BY…

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

但除此之外,DISTINCT将在执行DISTINCT之前计算出每个字段,即使它们是同一字段的确定性使用(例如,StartDate和DATEADD(day,1,StartDate)-检查执行计划,您将看到DATEADD是在DISTINCT之前完成的。因此分组方式几乎总是更好

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

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

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, ....

我知道你仍然需要把它全部打印出来,如果有
按t.*
分组会很好,但是如果你愿意,你可以在Crud上投票让微软知道。是的,我在那里发了个屁。完全忘记了distinct。谢谢。我投票否决了,然后意识到distinct回答了他实际提出的问题。对不起,我不知道谢谢你的提示!在SQLServer2005中,我尝试了这个方法,得到了“每个GROUPBY表达式必须至少包含一个非外部引用的列。”我不完全确定这意味着什么……SQL Server失败得很惨,它通过数字常量1、2、3、4进行分组。您只能在ORDER 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, ....