1

次のクエリのデータを見つける方法

元のソースの質問89

テーブル構造: 製品(メーカー、モデル、タイプ)

編集 スキーマにsqlfiddleを使用

タスク:
製品テーブルでモデルの数が最も多いメーカーと、モデルの数が最も少ないメーカーを見つけます。出力:メーカー、モデル数

問題のヒントはGROUP BY、、HAVINGIN

私はこれを見つけるためにさまざまな方法を試しました基本的に私が思いついたのは私が使う必要があるということですMax(COUNT(model))

結果は次のようになります

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

私が思いついた解決策の1つは

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
)

他に方法はありますか?

4

2 に答える 2

2

あなたは簡単に...

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;

...またはCTEが好きな場合...

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フィドルで示されているように。

于 2012-08-26T10:02:45.183 に答える
1

SQL Server 2008 を使用している場合は、次のように簡略化できます: http://www.sqlfiddle.com/#!3/25ba8/7

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;
于 2012-08-26T09:01:37.880 に答える