CREATE TABLE doctor( patient CHAR(13), docname CHAR(30) );
Say I had a table like this, then how would I display the names of the doctors that have
While using ... HAVING COUNT(*) = ( ...MAX().. ) works:
While using TOP / LIMIT / RANK etc works:
Also, using TOP / LIMIT of 1 will only give one row - what if there are two or more doctors with the same maximum number of patients?
I would break the problem into steps:
Get target field(s) and associated count
SELECT docName, COUNT( patient ) AS countX
FROM doctor
GROUP BY docName
Using the above as a 'statement scoped view', join to get the max count row(s)
WITH x AS
(
SELECT docName, COUNT( patient ) AS countX
FROM doctor
GROUP BY docName
)
SELECT x.docName, x.countX
FROM x
INNER JOIN
(
SELECT MAX( countX ) AS maxCountX
FROM x
) x2
ON x2.maxCountX = x.countX
The WITH clause, which defines a 'statement scoped view', effectively gives named sub-queries that can be re-used within the same query.
The JOIN matches the row(s) of the maximum count of the patients.
While this solution, using statement scoped views, is longer, it is:
It is easier to test as parts of the query can be run standalone.
It is self documenting as the query directly reflects the requirement ie the statement scoped view lists the target field(s) and associated count.
It is extendable as if other conditions or fields are required, this can be easily added to the statement scoped view. eg in this case, the table stucture should be changed to include a doctor-id as a primary key field and this should be part of the results.