2017-09-27 6 views
-2

Je suis en train de trier une table après une union tout dans SQL ServerGROUP BY erreur de clause SELECT UNION ALL ORDER BY requête

J'ai lu dans plusieurs endroits (ici par exemple: How to use order by with union all in sql?) que je dois écrire:

SELECT * 
FROM 
     (
      SELECT * FROM TABLE_A 
      UNION ALL 
      SELECT * FROM TABLE_B 
     ) dum 
-- ORDER BY ..... 

Cependant, je continue à avoir une erreur en disant:

Column 'dum.var' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 

alors que je n'ont pas de requête GROUP BY ...

Quelqu'un peut-il m'expliquer cela?

+0

Quelle est la structure de la table pour 'TABLE_A' et' TABLE_B'? Peut-être que le syndicat lui-même a un problème. –

+0

Non, ils ont la même structure, c'est-à-dire quatre variables (et dum.var en fait partie). En fait, quand j'omets le 'order by' et ne lance que ce que j'ai dans la parenthèse, ça marche bien ... – Lili

+0

Est-ce la requête exacte que vous utilisez? Ou avez-vous peut-être un peu de MAX, MIN, SUM, AVG ou autre dans votre requête? – Tyron78

Répondre

0
DECLARE @t1 TABLE(
    ID INT 
    ,Val INT 
); 

DECLARE @t2 TABLE(
    ID INT 
    ,Val INT 
); 


INSERT INTO @t1 VALUES (1, 10), (2, 20), (3, 30); 
INSERT INTO @t2 VALUES (1, 40), (2, 50), (3, 60); 

SELECT * 
FROM (
    SELECT x.ID, SUM(x.Val) SumVal 
    FROM (
    SELECT ID, 
      Val 
     FROM @t1 
    UNION ALL 
    SELECT ID, 
      Val 
     FROM @t2 
    ) x 
    GROUP BY x.ID 
) y 
ORDER BY SumVal 
1

Merci à Tyron78 ​​dans les commentaires ci-dessus, j'ai repéré l'erreur.

La requête réelle était:

SELECT * 
FROM 
(
SELECT 
     * 
FROM 
#TABLE1 
UNION ALL 
SELECT 
     * 
FROM 
#TABLE2 
) AS Z 
ORDER BY sum([Units]) DESC, [Distance], [ID], [Product] 

Le problème est dans la somme() depuis que je l'avais déjà résumé avant dans les deux Table1 et Table2. La bonne requête est la suivante:

SELECT * 
FROM 
(
SELECT 
     * 
FROM 
#TABLE1 
UNION ALL 
SELECT 
     * 
FROM 
#TABLE2 
) AS Z 
ORDER BY [Units] DESC, [Distance], [ID], [Product] 

Merci à tous!

0

Vous devrez indiquer le nom de la colonne sur laquelle vous souhaitez trier le jeu de résultats.

SELECT * 
FROM 
    (
     SELECT * FROM TABLE_A 
     UNION ALL 
     SELECT * FROM TABLE_B 
    ) dum 
order by <column_name> [asc|desc] 

Le doit être identique dans les deux tableaux.