para - Cómo usar group by con union en t-sql
select union sql server (4)
GRUPO POR 1
Nunca he conocido a GROUP BY para admitir el uso de ordinales, solo ORDER BY. De cualquier manera, solo MySQL admite GROUP BY que no incluye todas las columnas sin funciones agregadas realizadas en ellas. Los ordinales tampoco son prácticas recomendadas porque si se basan en el orden de SELECT; si eso cambia, también lo hace su ORDER BY (o GROUP BY si es compatible).
No es necesario ejecutar GROUP BY
en el contenido cuando utiliza UNION
: UNION garantiza que se eliminen los duplicados; UNION ALL
es más rápido porque no lo hace, y en ese caso necesitaría GROUP BY ...
Su consulta solo necesita ser:
SELECT a.id,
a.time
FROM dbo.TABLE_A a
UNION
SELECT b.id,
b.time
FROM dbo.TABLE_B b
¿Cómo puedo usar group by con union en t-sql? Quiero agrupar por la primera columna de un resultado de unión, escribí el siguiente sql pero no funciona. No sé cómo hacer referencia a la columna especificada (en este caso es 1) del resultado de la unión. muchas gracias.
SELECT *
FROM ( SELECT a.id ,
a.time
FROM dbo.a
UNION
SELECT b.id ,
b.time
FROM dbo.b
)
GROUP BY 1
Identificar la columna es fácil:
SELECT *
FROM ( SELECT id,
time
FROM dbo.a
UNION
SELECT id,
time
FROM dbo.b
)
GROUP BY id
Pero no resuelve el problema principal de esta consulta: ¿qué se debe hacer con los valores de la segunda columna al agruparlos por la primera? Ya que (¡peculiarmente!) Estás usando UNION
lugar de UNION ALL
, no tendrás filas duplicadas por completo entre las dos subtablas de la unión, pero es posible que tengas varios valores de tiempo para un valor de id, y no da ninguna pista de lo que quiere hacer: min, max, avg, sum, o qué? El motor SQL debería dar un error debido a eso (aunque algunos, como mysql, simplemente eligen un valor aleatorio entre varios, creo que sql-server es mejor que eso).
Entonces, por ejemplo, cambie la primera línea a SELECT id, MAX(time)
o similar.
Necesitas alias la subconsulta. Por lo tanto, su declaración debe ser:
Select Z.id
From (
Select id, time
From dbo.tablea
Union All
Select id, time
From dbo.tableb
) As Z
Group By Z.id
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