0
votes

grouper par deux colonnes jointes

CREATE TABLE T1 (a int);

CREATE TABLE T2 (a int);

SELECT T1.a , T2.a
FROM T1
JOIN T2 ON T1.a=T2.a
GROUP BY T1.a;
I get an error from this code:
  Msg 8120 Level 16.
  Column 'T2.a' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
I would have expected this to work because T1.a and T2.a are joined

1 commentaires

@LudovicAubert. . . Votre attente est fausse. C'est aussi simple que cela. Les colonnes (expressions) non agrégées dans SELECT doivent être dans GROUP BY .


3 Réponses :


2
votes

J'aurais attendu que cela fonctionne car T1.A et T2.A sont rejoints P>

Cela a du sens, mais malheureusement: non. SQL Server voit deux colonnes non traitées différentes dans la clause code> (code> code>, et les souhaite dans la clause code> également: p> xxx pré>

D'autre part, étant donné que vous em> vous joignez à ces colonnes, vous savez également que les deux ont la même valeur, alors pourquoi devriez-vous avoir besoin de produire les deux dans les Resultats? P>

SELECT a
FROM T1
JOIN T2 ON USING(a)
GROUP BY a


0 commentaires

0
votes

Il suffit d'ajouter la colonne t2.a dans GROUP BY :

SELECT 
T1.a , T2.a
FROM T1
JOIN T2 ON T1.a= T2.a
GROUP BY T1.a, T2.a;

Il faut ajouter t2.a comme lorsque SQL Server regroupe les mêmes lignes par t1.a , il ne sait pas quelle colonne doit être choisie pour t2.a .

p>


0 commentaires

1
votes

Je m'attendais à ce que cela fonctionne parce que T1.a et T2.a sont joints

Le standard SQL stipule que lorsqu'il y a dépendance entre les colonnes d'une même table , il n'est pas nécessaire d'agréger les dépendants. Par exemple, si vous effectuez une agrégation par clé primaire, vous n'avez pas besoin d'agréger d'autres colonnes du même tableau. Cependant ce n'est pas le cas, puisque le T2.a est sur une table différente. Néanmoins, SQL Server n'implémente pas cette partie de la norme de toute façon.

Maintenant, avec une modification mineure, cela fonctionne:

SELECT T1.a , T2.a
FROM T1
JOIN T2 ON T1.a=T2.a
GROUP BY T1.a , T2.a;

Voir l'exemple d'exécution à DB Fiddle .


0 commentaires