3

select句で言及されているフィールドをうんざりして繰り返す必要がないように、group by句を短くすることはできますか? 例えば:

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

まだすべてを入力する必要があると思います。あると便利ですが、必要に応じて、 https://connect.microsoft.com/SQLServer/feedback/ViewFeedbackGROUP BY t.*で投票して Microsoft に知らせることができます。 .aspx?FeedbackID=124654

于 2010-01-04T02:20:04.660 に答える
0

それらは2つの異なる概念です。

  • SELECT=出力
  • GROUPBY=何を集計するか

ここで、各SELECTエントリを集約するか、GROUPBYに含める必要があります。多くの場合、GROUPBYには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

ただし、この例では、GROUPBYを指定せずにDISTINCTを使用します。

于 2009-10-19T14:11:26.747 に答える