2010-03-29 7 views
0

J'ai le tableau suivant:
patients
id
Nom
diagnosis_idtop SQL + count() confusion

Ce que je dois faire est d'obtenir tous les patients avec N le plus populaire diagnostic.
Et je ne reçois rien en utilisant cette requête:
SELECT name FROM patients
WHERE diagnosis_id IN
(SELECT TOP(5) COUNT(diagnosis_id) FROM patients
GROUP BY diagnosis_id
ORDER BY diagnosis_id)

Comment le réparer?

Répondre

3
SELECT name FROM patients 
WHERE diagnosis_id IN 
(
SELECT TOP(5) diagnosis_id FROM patients 
GROUP BY diagnosis_id 
ORDER BY COUNT(diagnosis_id) desc 
) 
0
select p.name from patients p 
inner join (
    select top 5 diagnosis_id, count(*) as diagnosis_count 
    from patients 
    group by diagnosis_id 
    order by diagnosis_count) t on t.diagnosis_id = p.diagnosis_id 
0

essayez ceci:

SELECT name FROM patients 
WHERE diagnosis_id IN 
(SELECT TOP(5) diagnosis_id FROM patients 
GROUP BY diagnosis_id 
ORDER BY COUNT(diagnosis_id)) 
1

Un couple de choses mal avec ceci:

abord, je recommend using a common table expression pour la recherche "top 5" plutôt qu'un sous-requête - à moi, ça rend les choses un peu plus claires, et même si ça n'a pas d'importance ici, ça marcherait mieux dans une vraie situation de travail. Cependant, le principal problème est que vous commandez la recherche du top 5 par l'ID de diagnostic plutôt que par le nombre. Vous devrez faire ORDER BY COUNT(diagnosis_id) à la place.