Maison > Questions et réponses > le corps du texte
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粉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 ;
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 ;
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 ;
P粉9365685332024-03-31 09:12:10
Utilisation 求和
:
select position, sum(experience = 100) from tbl group by position