mysql sql group-by case

mysql case group by



¿Puedes AGRUPAR POR UN CASO CUANDO ENTONCES el nombre de alias? (2)

Debe utilizar la sentencia CASE completa en la cláusula GROUP BY si no la incluyó en una subconsulta.

SELECT CASE WHEN DATEDIFF(o.EndDate, o.StartDate) < 30 THEN ''<1 Month'' WHEN DATEDIFF(o.EndDate, o.StartDate) < 90 THEN ''1 - 2 Months'' WHEN DATEDIFF(o.EndDate, o.StartDate) < 210 THEN ''3 - 4 Months'' ELSE ''>4 Months'' END AS `Length`, COUNT(DISTINCT(person.ID)) AS `COUNT` FROM person INNER JOIN opportunity AS o ON person.EntityID = o.id INNER JOIN Organization AS org ON o.OrganizationID = Org.ID WHERE person.TitleID = 2 AND o.bID = 1 GROUP BY CASE WHEN DATEDIFF(o.EndDate, o.StartDate) < 30 THEN ''<1 Month'' WHEN DATEDIFF(o.EndDate, o.StartDate) < 90 THEN ''1 - 2 Months'' WHEN DATEDIFF(o.EndDate, o.StartDate) < 210 THEN ''3 - 4 Months'' ELSE ''>4 Months'' END ORDER BY Length ASC;

Elimine también las comillas simples alrededor del nombre de la columna en la cláusula ORDER BY .

Tengo una instrucción SELECT que se calcula a partir de un estado CASE WHEN THEN (o podría usar varias declaraciones IF) con alias como ''Longitud'', y necesito agrupar correctamente los resultados. El SELECT parece estar funcionando, pero el grupo los agrupa mal. Aquí está mi declaración:

SELECT CASE WHEN DATEDIFF(o.EndDate, o.StartDate) < 30 THEN ''<1 Month'' WHEN DATEDIFF(o.EndDate, o.StartDate) < 90 THEN ''1 - 2 Months'' WHEN DATEDIFF(o.EndDate, o.StartDate) < 210 THEN ''3 - 4 Months'' ELSE ''>4 Months'' END AS ''Length'', COUNT(DISTINCT(person.ID)) AS ''COUNT'' FROM person INNER JOIN opportunity AS o INNER JOIN Organization AS org ON person.EntityID = o.id AND O.OrganizationID = Org.ID WHERE person.TitleID = 2 AND o.bID = 1 GROUP BY ''Length'' ORDER BY ''Length'' ASC;

Esto agrupa todos los resultados en ''3 - 4 meses'', lo cual no es correcto.


Estaba luchando con exactamente el mismo problema y aquí está la solución que se me ocurrió:

SELECT CASE WHEN DATEDIFF(o.EndDate, o.StartDate) < 30 THEN ''<1 Month'' WHEN DATEDIFF(o.EndDate, o.StartDate) < 90 THEN ''1 - 2 Months'' WHEN DATEDIFF(o.EndDate, o.StartDate) < 210 THEN ''3 - 4 Months'' ELSE ''>4 Months'' END AS `Length`, COUNT(DISTINCT(person.ID)) AS `COUNT` FROM person INNER JOIN opportunity AS o INNER JOIN Organization AS org ON person.EntityID = o.id AND O.OrganizationID = Org.ID WHERE person.TitleID = 2 AND o.bID = 1 GROUP BY `Length` ORDER BY `Length` ASC;