web-dev-qa-db-ja.com

T-SQLでユニオンを使用してグループバイを使用する方法

T-SQLでユニオンとグループバイを使用するにはどうすればよいですか?ユニオンの結果の最初の列でグループ化したいのですが、次のsqlを作成しましたが、機能しません。ユニオン結果の指定された列(この場合は1)を参照する方法がわかりません。まことにありがとうございます。

SELECT  *
FROM    ( SELECT    a.id ,
                    a.time
          FROM      dbo.a
          UNION
          SELECT    b.id ,
                    b.time
          FROM      dbo.b
        )
GROUP BY 1
24
Just a learner

GROUP BY 1

ORDER BYのみを使用して、序数の使用をサポートするGROUP BYを知らなかった。いずれにしても、集計関数が実行されていないすべての列を含まないGROUP BYをサポートするのはMySQLのみです。順序は、SELECTの順序に基づいている場合-変更された場合はORDER BY(またはサポートされている場合はGROUP BY)も変更するため、推奨されません。

UNIONを使用している場合、コンテンツに対してGROUP BYを実行する必要はありません-UNIONは重複が削除されるようにします。 UNION ALLは高速ではないため、高速です。その場合、GROUP BY ...が必要になります。

クエリは次のもののみが必要です。

SELECT a.id,
       a.time
  FROM dbo.TABLE_A a
UNION
SELECT b.id,
       b.time
  FROM dbo.TABLE_B b
19
OMG Ponies

サブクエリのエイリアスを作成する必要があります。したがって、ステートメントは次のようになります。

Select Z.id
From    (
        Select id, time
        From dbo.tablea
        Union All
        Select id, time
        From dbo.tableb
        ) As Z
Group By Z.id
91
Thomas

列の識別は簡単です:

_SELECT  *
FROM    ( SELECT    id,
                    time
          FROM      dbo.a
          UNION
          SELECT    id,
                    time
          FROM      dbo.b
        )
GROUP BY id
_

しかし、このクエリの主な問題は解決しません。最初の列の値でグループ化するときに、2番目の列の値で何をする必要がありますか? (特に!)_UNION ALL_ではなくUNIONを使用しているため、ユニオンの2つのサブテーブル間に完全に複製行はありませんが、 idの1つの値に対して複数の時間の値があり、min、max、avg、sum、またはwhat ?!そのため、SQLエンジンはエラーを出すはずです(mysqlなどのいくつかは、ランダムな値を選択しますが、sql-serverはそれよりも優れていると思います)。

したがって、たとえば、最初の行をSELECT id, MAX(time)などに変更します!

6
Alex Martelli