Как использовать group by для вычисления Max(Count(Columnname)) из таблицы

Как найти данные для следующего запроса

Первоначальный источник вопрос 89

Структура таблицы: продукт (производитель, модель, тип)

Изменить Использовать sqlfiddle для схемы

Задача:
Найдите тех производителей, которые имеют наибольшее количество моделей в таблице Product, а также тех, у кого наименьшее количество моделей. Выход: производитель, количество моделей

Подсказки, данные в вопросе GROUP BY, HAVING а также IN

Я пробовал различные способы найти это в основном то, что я придумал, мне нужно использовать Max(COUNT(model))

Результат должен быть

maker   qty 
A        7 --max
C        1 --min

Одно решение, которое я придумал,

select maker, count(ps.model) as Count from product as ps
group by ps.maker
having count(ps.model) in
(
select max(cnt) from (select count(model) as cnt from product group by maker)t
union
select min(cnt) from (select count(model) as cnt from product group by maker)t
)

Есть ли другой путь.

2 ответа

Решение

Если вы используете SQL Server 2008, вы можете упростить его с помощью этого: http://www.sqlfiddle.com/

with counts as
(
  select maker, count(ps.model) as Count from product as ps
  group by ps.maker
)
select cx.*
from counts cx
join
(
  select min(count) as lo, max(count) as hi
  from counts
) as hi_lo 
on cx.count = hi_lo.lo or cx.count = hi_lo.hi;

Вы можете просто...

SELECT *
FROM (
    SELECT TOP 1 maker, COUNT(*) C
    FROM product
    GROUP BY maker
    ORDER BY C DESC
) Q1
UNION
SELECT *
FROM (
    SELECT TOP 1 maker, COUNT(*) C
    FROM product
    GROUP BY maker
    ORDER BY C
) Q2;

... или если вы любите CTEs...

WITH CTE AS (
    SELECT maker, COUNT(*) C
    FROM product
    GROUP BY maker
)
SELECT *
FROM (
    SELECT TOP 1 *
    FROM CTE
    ORDER BY C DESC
) Q1
UNION
SELECT *
FROM (
    SELECT TOP 1 *
    FROM CTE
    ORDER BY C
) Q2;

... как показано в этой скрипте SQL.

Другие вопросы по тегам