Usando GROUP-BY-HAVING en dos tablas unidas

Estoy tratando de unir dos tablas y seleccionar columnas de ambas en función de las restricciones, así como de una condición de grupo por tener. Estoy experimentando algunos problemas y comportamientos que no entiendo. Estoy usando sybase. Un ejemplo simple a continuación

CREATE TABLE #test(
name varchar(4),
num  int,
cat  varchar(3)
)

CREATE TABLE #other(
name varchar(4),
label varchar(20)
)

Insert #test VALUES('a',2,'aa') 
Insert  #test VALUES  ('b',2,'aa') 
Insert  #test VALUES  ('c',3,'bb')
Insert  #test VALUES ( 'a',3,'aa')
Insert  #test VALUES ( 'd',4,'aa')

Insert #other VALUES('a','this label is a') 
Insert  #other VALUES  ('b','this label is b') 
Insert  #other VALUES  ('c','this label is c')
Insert  #other VALUES ( 'd','this label is d')


SELECT t.name,t.num,o.label  
FROM #other o inner JOIN #test t ON o.name=t.name 
WHERE t.name='a' 
GROUP BY t.name 
HAVING t.num=MAX(t.num)

Me sale sin sentido cuando tengo el GROUP BY (las columnas de etiquetas están claramente relacionadas con un t.name diferente). Si corto el GROUP BY declaración, la consulta se comporta como esperaría, pero luego me veo obligado a usar esto como una subconsulta y luego aplicar

SELECT * FROM (subquery here) s GROUP BY s.name having s.num=MAX(s.num)

Tiene que haber una mejor manera de hacer esto. Cualquier ayuda y explicación para este comportamiento sería muy apreciada.

** Debo aclarar. En mi consulta real, tengo algo como SELECCIONAR ... DESDE (tablas unidas) DONDE nombre EN (lista larga de nombres), AGRUPAR POR .....

preguntado el 22 de mayo de 12 a las 17:05

Como WHERE t.name='a', no entiendo el punto de GROUP BY t.name. Por favor, aclárelo mostrando la salida. -

3 Respuestas

Puede intentar lo siguiente, si entiendo bien su consulta.

SELECT t.name,t.num,o.label  
FROM #other o inner JOIN #test t ON o.name=t.name 
WHERE t.name='a' AND t.num=MAX(t.num)

contestado el 22 de mayo de 12 a las 17:05

El problema es que quiero el máximo (t.num) para cada t.name. Sé que no hace mucho desde aquí, ya que estoy haciendo t.name = 'a', pero en mi consulta real tengo t.name en ('gran lista de letras') - JPC

Su GROUP BY debe incluir t.name, t.num y o.label. Si haces esto

GROUP BY t.name, t.num, o.label

entonces la consulta se ejecuta sin error.

Sin embargo, no está calculando ningún valor agregado en el grupo por.
¿Que estás tratando de hacer?

contestado el 22 de mayo de 12 a las 17:05

Este fue un ejemplo simplificado de lo que estoy tratando de hacer. En mi consulta real, estoy tratando de obtener el último registro fechado (es decir, max t.num) para cada t.name - JPC

@jpc: vea la respuesta de John Dewey, ¿es eso lo que necesita? - Phil

Si entiendo su requerimiento correctamente, ejecutando esto...

SELECT t.name, num=MAX(t.num), o.label
FROM #other o
INNER JOIN #test t ON o.name=t.name
WHERE t.name='a'
GROUP BY t.name, o.label;

... me da este resultado:

name num         label
---- ----------- --------------------
a    3           this label is a

contestado el 22 de mayo de 12 a las 18:05

Creo que no expresé bien mi pregunta. Me disculpo. Básicamente, la razón por la que estoy usando el nombre GROUP BY HAVING num=MAX(num) no es realmente porque quiero el MAX(num) real, sino porque los datos asociados con ese registro específico son lo que quiero. Mi proyecto real involucra datos de series temporales para varias entidades a través de varios factores, por lo que quiero recuperar la fecha más reciente para cada entidad específica (en mi ejemplo simplificado, el nombre es la entidad y el número la fecha). Pero también quiero una cláusula where antes y las columnas seleccionadas para hacer referencia a las columnas de las 2 tablas unidas. - JPC

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.