質問

t-sqlでunionを使用してgroup byを使用するにはどうすればよいですか?結合の結果の最初の列でグループ化したいのですが、次のSQLを書きましたが、機能しません。ユニオン結果の指定された列(この場合は1)を参照する方法がわかりません。 本当にありがとう。

SELECT  *
FROM    ( SELECT    a.id ,
                    a.time
          FROM      dbo.a
          UNION
          SELECT    b.id ,
                    b.time
          FROM      dbo.b
        )
GROUP BY 1
役に立ちましたか?

解決

  

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

他のヒント

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

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

列の識別は簡単です:

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

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

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

with UnionTable as  
(
    SELECT a.id, a.time FROM dbo.a
    UNION
    SELECT b.id, b.time FROM dbo.b
) SELECT id FROM UnionTable GROUP BY id
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top