Maison  >  Questions et réponses  >  le corps du texte

Recherchez la valeur maximale dans le tableau puis affichez les groupes SQL séparément et le nombre de valeurs maximales dans chaque groupe SQL

ID  POSITION    EXPERIENCE  SALARY
1   top               90    1500
2   bottom           100    1500
3   top               90    750
4   left              90    1000
5   right            100    1300
6   top               90    1500
7   left              80    2000
8   top               80    1000
9   bottom           100    2000
10  left             100    2000

Donc, voici mon SERVICE de table, où (comme nous pouvons le voir) l'expérience maximale est de 100. J'ai besoin d'écrire une requête pour trouver le nombre d'occurrences de 100 dans l'expérience pour chaque groupe formé par position (gauche, droite, haut, bas).

Alors j'ai écrit :-

select position,count(*)
from service
group by position
having experience=(select max(experience) from service);

Résultat attendu :-

POSITION  COUNT(*)
bottom         2 
left           1
right          1
top            0

Mais, Cela m'a donné une erreur : - "Pas une expression GROUP BY"

Ma logique est que je le divise d'abord en groupes, puis j'utilise la clause have pour compter les tuples de chaque groupe avec une expérience égale à la valeur maximale. expérience.

P粉451614834P粉451614834190 Il y a quelques jours371

répondre à tous(2)je répondrai

  • P粉718730956

    P粉7187309562024-03-31 14:00:05

    Une solution consiste à utiliser une jointure gauche avec une sous-requête, qui ne renvoie que la valeur maximale. Un cas est nécessaire pour renvoyer le groupe avec une valeur maximale arbitraire.

    SELECT s.position,
           sum(case when max_experience is null then 0 else 1 end ) as max_count
    FROM service s
    LEFT JOIN  ( select max(experience) as max_experience
                 from service 
                ) as s1 ON  s.experience = s1.max_experience
    group by s.position
    order by max_count desc ;

    https://dbfiddle.uk/-8pHZ8wm

    Pour faciliter la compréhension, exécutez la requête ci-dessous et vous constaterez que max_experience est vide dans chaque ligne de la table de service, à l'exception de la valeur 100. En termes simples, il vous suffit de compter les lignes du groupe avec les valeurs 100 et 0 qui n'ont pas encore atteint la valeur d'expérience maximale.

    SELECT s.*,s1.*
    FROM service s
    LEFT JOIN  (select max(experience) as max_experience
                 from service 
                ) as s1 ON  s.experience = s1.max_experience ;

    https://dbfiddle.uk/al8YYLk9

    Modifier. La réponse fonctionne également dans Oracle, mais les mots-clés après la sous-requête doivent être supprimés as

    SELECT s.position,
           sum(case when max_experience is null then 0 else 1 end ) as max_count
    FROM service s
    LEFT JOIN  ( select max(experience) as max_experience
                 from service 
                )  s1 ON  s.experience = s1.max_experience
    group by s.position
    order by max_count desc ;

    https://dbfiddle.uk/hhGB_xXx

    répondre
    0
  • P粉936568533

    P粉9365685332024-03-31 09:12:10

    Utilisation 求和 :

    select position, sum(experience = 100) from tbl group by position

    Voir violon.

    répondre
    0
  • Annulerrépondre