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?