varios registros promedio funciones funcion ejemplo datos contar consultas campos avg agrupar agrupamiento agrupados agrupadas agregacion sql oracle group-by grouping like

promedio - sql contar registros agrupados



SQL: ¿Es posible ''agrupar por'' según los resultados de la función ''me gusta''? (5)

Estoy usando Oracle SQL y quiero agrupar algunas filas diferentes que den como resultado la función ''me gusta''. Para elaborar con un ejemplo:

Supongamos que tengo una tabla MESA con una de las columnas es una cadena enorme. Y estoy contando el número de filas que coinciden con patrones particulares:

SELECT m.str, count(*) FROM MESA m WHERE m.str LIKE ''%FRUIT%'' AND (m.str LIKE ''%APPLE%'' OR m.str LIKE ''%ORANGE%'')

Entonces supongamos que el resultado de esta consulta es:

FRUIT..afsafafasfa ... RED_APPLE 20

FRUIT..afsafafasfa ... YELLOW_APPLE 12

FRUIT..afsafafasfa ... GREEN_APPLE 3

FRUIT..afsafafasfa ... PURPLE_ORANGE 4

FRUIT..afsafafasfa ... RED_ORANGE 45

Pero quiero que mis resultados sean:

MANZANA 35

NARANJA 49

¿Es posible hacer esto? Si es así, ¿cómo es eso? :)

Comentarios y fragmentos de código son muy apreciados.

PD: por supuesto, la consulta y los resultados son más complicados que el ejemplo anterior. Simplemente lo escribí como por simplicidad para explicarlo.

Aclamaciones..


¿Algo como esto?

SELECT Fruit, SUM(counter) FROM ( SELECT CASE WHEN m.str LIKE ''%APPLE%'' THEN ''APPLE'' ELSE ''ORANGE'' END AS Fruit COUNT(*) AS counter FROM MESA m WHERE m.str LIKE ''%FRUIT%'' AND (m.str LIKE ''%APPLE%'' OR m.str LIKE ''%ORANGE%'') GROUP BY m.str ) GROUP BY Fruit


Lo haría de esta manera: solo se requiere un cambio para agregar tipos adicionales de fruta.

WITH fruits AS ( SELECT ''APPLE'' fruit FROM DUAL UNION ALL SELECT ''ORANGE'' fruit FROM DUAL ) SELECT fruit, count(*) FROM MESA m, fruits WHERE m.str LIKE ''%FRUIT%'' AND m.str LIKE ''%'' || fruits.fruit || ''%'' GROUP BY fruit

Si sus cadenas están en el formato que mostró en sus datos de muestra, consideraría cambiar el predicado a una condición, WHERE m.str LIKE ''FRUIT%'' || fruits.fruit ||''%'' WHERE m.str LIKE ''FRUIT%'' || fruits.fruit ||''%'' .


Otra variante de la respuesta de David Markle:

SELECT fruit_name, count(1) as fruit_count FROM ( SELECT CASE WHEN m.str LIKE ''%APPLE%'' THEN ''Apple'' WHEN m.str LIKE ''%ORANGE%'' THEN ''Orange'' END as fruit_name FROM MESA m WHERE m.str LIKE ''%FRUIT%'' AND (m.str LIKE ''%APPLE%'' OR m.str LIKE ''%ORANGE%'') ) GROUP BY fruit_name

Lo mismo, pero solo se requiere 1 CASO, lo que simplifica el soporte ...


Por supuesto:

WITH Fruits AS ( SELECT CASE WHEN m.str LIKE ''%APPLE%'' THEN ''Apple'' WHEN m.str LIKE ''%ORANGE%'' THEN ''Orange'' END AS FruitType FROM MESA m WHERE m.str LIKE ''%FRUIT%'') SELECT FruitType, COUNT(*) FROM Fruits WHERE FruitType IN (''Apple'', ''Orange'') GROUP BY FruitType;


SELECT count(*) AS ''Apples'' FROM MESA m WHERE m.str LIKE ''%FRUIT%'' AND m.str LIKE ''%APPLE%'' SELECT count(*) AS ''Oranges'' FROM MESA m WHERE m.str LIKE ''%FRUIT%'' AND m.str LIKE ''%ORANGE%''

Funcionaría eso?