web-dev-qa-db-fra.com

Comment utiliser group by avec union dans t-sql

Comment utiliser group by avec union dans t-sql? Je veux regrouper par la première colonne d'un résultat d'union, j'ai écrit le sql suivant mais cela ne fonctionne pas. Je ne sais tout simplement pas comment référencer la colonne spécifiée (dans ce cas, 1) du résultat de l'union. grand merci.

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

GROUPE PAR 1

Je n'ai jamais connu GROUP BY pour prendre en charge l'utilisation d'ordinaux, seulement ORDER BY. Quoi qu'il en soit, seul MySQL prend en charge GROUP BY, n'incluant pas toutes les colonnes sans fonctions d'agrégation exécutées sur elles. Les ordinaux ne sont pas non plus recommandés car s'ils sont basés sur l'ordre du SELECT - si cela change, votre ORDER BY (ou GROUP BY si pris en charge) en fait de même.

Il n'est pas nécessaire d'exécuter GROUP BY sur le contenu lorsque vous utilisez UNION - UNION garantit que les doublons sont supprimés; UNION ALL est plus rapide car il ne l'est pas - et dans ce cas, vous auriez besoin du GROUP BY ...

Votre requête doit seulement être:

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

Vous devez alias la sous-requête. Ainsi, votre déclaration devrait être:

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

Identifier la colonne est simple:

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

Mais cela ne résout pas le problème principal de cette requête: que faire des valeurs de la deuxième colonne lors du regroupement par la première? Puisque (particulièrement!) Vous utilisez UNION plutôt que UNION ALL, Vous n'aurez pas entièrement dupliqué lignes entre les deux sous-tables de l'union, mais vous pouvez ont toujours très bien plusieurs valeurs de temps pour une valeur de l'id, et vous ne donnez aucune indication de ce que vous voulez faire - min, max, moy, somme, ou quoi?! Le moteur SQL devrait donner une erreur à cause de cela (bien que certains comme mysql choisissent simplement une valeur aléatoire parmi les plusieurs, je pense que sql-server est meilleur que cela).

Ainsi, par exemple, changez la première ligne en SELECT id, MAX(time) ou similaire!

6
Alex Martelli