【问题标题】:How to use group by to compute Max(Count(Columnname)) from Table如何使用 group by 从表中计算 Max(Count(Columnname))
【发布时间】:2012-08-26 08:40:08
【问题描述】:

如何查找以下查询的数据

Original Source第89题

表结构: 产品(制造商、型号、类型)

编辑 Use sqlfiddle for schema

任务:
找出那些拥有最多模型的制造商 产品表以及模型数量最少的那些。 输出:制造商、模型数量

有问题的提示是GROUP BYHAVINGIN

我尝试了各种方法来找到这个基本上我想出的是我需要使用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
)

还有没有其他办法。

【问题讨论】:

  • @marc_s ussign sql-ex.ru 练习我在哪里得到这个问题。所以不能说数据库,但这是一个简单的 RDBMS 问题
  • 您还可以练习您的 SQL 技能并检查它是否与 RDBMS 无关,试试这个:sqlfiddle.com
  • @MichaelBuen:对于这个全新的数据集,需要在开始练习之前创建。但是 sql-ex 提供了预建的数据库来练习 select 查询。
  • @MichaelBuen:添加了 sqlfiddle

标签: sql sql-server-2008 group-by having-clause


【解决方案1】:

你可以简单...

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 Fiddle 中所展示的那样。

【讨论】:

    【解决方案2】:

    如果您使用的是 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;
    

    【讨论】:

    • 刚刚添加SqlFiddle。架构略有不同。我没有预先计算过计数。需要根据厂商计算。
    • 谢谢..我没有想到这个解决方案。相反,我想使用 TOP 1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 2015-11-11
    • 2011-08-01
    • 2019-03-21
    • 2018-10-26
    相关资源
    最近更新 更多