10
votes

SQL: est-il possible de "groupe par" selon "comme" des résultats de la fonction?

J'utilise Oracle SQL et je souhaite regrouper certaines lignes différentes qui "comme" les résultats de la fonction. Pour élaborer avec un exemple:

supposons que j'ai une table Mesa avec une des colonnes est une énorme chaîne. Et je compte le nombre de lignes correspondant à des motifs particuliers: xxx

alors supposons que le résultat de cette requête est le suivant:

Fruit..afsafafasfa ... Red_apple 20

Fruit..afsafafasfa ... Jaune_apple 12

Fruit..afsafafasfa ... Green_apple 3

Fruit..afsafafasfa ... Purple_orange 4

Fruit..afsafafasfa ... red_orange 45

mais je veux que mes résultats soient:

Apple 35

orange 49


est-ce possible? Si oui, comment ça va? :)

Les commentaires et les extraits de code sont très appréciés.

PS: Bien sûr, la requête et les résultats sont plus compliqués que l'exemple ci-dessus. Je viens de l'écrire comme pour que la simplicité soit expliquée.

acclamations ..


2 commentaires

Qu'en est-il des chaînes comme celle-là: «fruit..afsafafasfa ... orange_apple»?;)


Oui, c'est une bonne remarque. Pour mon cas, ce n'est pas très susceptible d'avoir de telles chaînes. Je suppose que cela dépend de l'ordre des cas.


5 Réponses :


0
votes
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%'
Would that work?

1 commentaires

Merci pour la réponse Jnkyle. J'ai également pensé à cela, mais la réponse de Dave est plus appropriée pour mon cas (car j'ai beaucoup de groupes à faire)



13
votes

sûr: xxx


1 commentaires

Merci Dave. J'aime ça avec trucie :)



0
votes

quelque chose comme ça? XXX


2 commentaires

Vous ne pouvez pas utiliser Count (*) sans clause de regroupement ... (regardez Select interne)


@ ThinkJet- Désolé, je pensais avoir un groupe par la sélection interne



2
votes

Une autre variante de David Markle Réponse:

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  


1 commentaires

Merci pour la réponse ThinkJet. Très appréciée.



0
votes

Je le ferais de cette façon - nécessite un seul changement pour ajouter des types supplémentaires de fruits.

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


0 commentaires